C++14 – Göze Çarpanlar

C++14 – Lambda fonksiyonlarında yakalanan ifadelerde ilk değer

C++11 ile gelen özelliklerden biri olan lambda ifadelerinde içinde olduğu bilinirlik alanından value-copy veya reference ile değişkenler, lambda fonksiyonunun gövdesine enjekte edilebiliyordu.

C++14 teki değişiklik ile bu değişkenlere başlangıç değeri de verilebilmekte bu da aslında std::move edilebilmelerinin önünü açıyor.

#include <iostream>
#include <iomanip>


using namespace std;

int main()
{
int i = 10;
auto lambda1 = [i = 5] () {
cout << i << endl;
};

lambda1();

std::unique_ptr ptr(new int(10));
auto lambda2 = [value = std::move(ptr)] {return *value;};

cout << lambda2() << endl;

return 0;
}

C++14 – Variable Template – Değişken şablonları

C++11 de gelen variadic templatelerle derleme zamanında iyi işler çıkarabiliyorduk. C++14’te derleme zamanına değişken şablonlar da (variable template) eklendi. Baya da hoş oldu 🙂

#include <iostream>
#include <iomanip>


using namespace std;

template
constexpr T pi = T( 3.14159265358979323);

template
constexpr const char* pi = "pi";

int main()
{

cout << setprecision(20);
cout << pi << endl;
cout << pi << endl;

return 0;
}

C++14 – [[deprecated]]
Deprecated olan neredeyse herşeyin bildirimi için C++14 standartlarında dile eklenen özelliktir.

#include <iostream>

using namespace std;

[[deprecated]] int f();

class [[deprecated]] my_class {
public:
[[deprecated]] int member;
};

[[deprecated]] int i;

enum [[deprecated]] colors{
RED, BLUE, BLACK
};


[[deprecated]]
typedef int type;

template class templ;

template
class [[deprecated]] templ {};

[[deprecated("g() is thread-unsafe. Use h() instead")]]
void g( int& x );

void h( int& x );

int main()
{

int a = f(); // warning: 'f' is deprecated
g(a); // warning: 'g' is deprecated: g() is thread-unsafe. Use h() instead
my_class my;

return 0;
}

C++14 – Generic Lambdalar

C++11 ile gelen anonymous fonksiyonlar oluşturmamızı sağlayan lambdalar, C++14 ile birlikte auto anahtar sözcüğünün kullanımı sayesinde daha genel olarak tanımlanabilirler. Örneğin;

#include <iostream>
#include <vector>

using namespace std;

int main()
{

vector ivec = {1, 2, 4, 4, 5, 6, 7, 8, 2, 8};

//C++11
auto printVec11 = [] (std::vector &vec) {
for (auto i : vec)
cout << i << " ";
};

//C++14
auto printVec14 = [] (auto &vec) {
for (auto i : vec)
cout << i << " ";
};

printVec11(ivec);
cout << "\n";
printVec14(ivec);

return 0;
}