C+14の新しい特性のすべての知識点はここにあります。
前の手順では、C++11の新しい特性を紹介しました。ここで()この記事では、C+14の新しい特性を紹介します。
関数の戻り値の種類の導出
C+14は、関数の戻りタイプの導出ルールを最適化しました。まずコードを見ます。
戻り値タイプの導出はテンプレートにも使用できます。
関数内に複数のreturn文がある場合、それらは同じ種類を返さなければなりません。そうでなければ、コンパイルに失敗します。
C+11では、lamda表現パラメータは具体的なタイプ宣言を使用する必要があります。
C+14は変数テンプレートをサポートします。
C+14も別名テンプレートをサポートしています。
C+14はC+11のconstexprに比べていくつかの制限を減らしました。
C++11でconstexpr関数は再帰的に使用でき、C+14でローカル変数とループが使用できます。
C++14にdeprecatedマークが追加されました。クラスの変更、関数などは、プログラムに修飾されたコードが使用された場合、コンパイルされたときに警告が発生します。ユーザーは、開発者にこのマークが修飾された内容は将来破棄される可能性があります。なるべく使わないようにしてください。
C+14はバイナリ字面量を導入しています。セパレータも導入しています。目がくらむのを防止します。
私達はすべて知っています。C+11にstdがあります。shared、stdがない:make_uniqueは、C+14で改善されました。
C+14通過std:sharred_timed_mustexとstd:shared_ロックは読み書きロックを実現し、複数のスレッドを同時に読むことができるようにするが、書き込みスレッドは独立して実行しなければならず、書き込み操作は同時に読み取り操作と一緒に行うことができない。
実現方法は以下の通りです。
std::integer_sequence
std::integer_sequenceとstd:tupleの配合使用:
コードを直接見ましょう。
exchangeの実現を見ることができます。
std:「quot ted」
C+14はstdを導入します。「quot」は文字列に二重引用符を追加して、直接コードを見ます。
参照リンク
https://en.cppreference.com/w/cpp/14
https://en.cppreference.com/w/cpp/language/function#Return_タイプdeduction.28 since_C.2 B.B 14.29
https://en.cppreference.com/w/cpp/language/lambda
https://en.cppreference.com/w/cpp/language/constexpr
https://en.cppreference.com/w/cpp/language/constexpr
ここで、C+14の新しい特性に関するすべての知識点をここで紹介します。C+14の新しい特性に関する内容は以前の文章を検索してください。または下記の関連記事を引き続きご覧ください。これからもよろしくお願いします。
関数の戻り値の種類の導出
C+14は、関数の戻りタイプの導出ルールを最適化しました。まずコードを見ます。
#include <iostream>
using namespace std;
auto func(int i) {
return i;
}
int main() {
cout << func(4) << endl;
return 0;
}
C+11を使ってコンパイルします
~/test$ g++ test.cc -std=c++11
test.cc:5:16: error: ‘func' function uses ‘auto' type specifier without trailing return type
auto func(int i) {
^
test.cc:5:16: note: deduced return type only available with -std=c++14 or -std=gnu++14
上のコードはC+11を使ってコンパイルできません。コンパイラで出力された情報もこの特性が見られます。C+14までサポートされます。戻り値タイプの導出はテンプレートにも使用できます。
#include <iostream>
using namespace std;
template<typename T> auto func(T t) { return t; }
int main() {
cout << func(4) << endl;
cout << func(3.4) << endl;
return 0;
}
注意:関数内に複数のreturn文がある場合、それらは同じ種類を返さなければなりません。そうでなければ、コンパイルに失敗します。
auto func(bool flag) {
if (flag) return 1;
else return 2.3; // error
}
// inconsistent deduction for auto return type: ‘int' and then ‘double'
return文が初期化リストに戻ると、戻り値タイプの導出も失敗します。
auto func() {
return {1, 2, 3}; // error returning initializer list
}
関数が虚関数であれば、戻り値の種類を使って導出できません。
struct A {
// error: virtual function cannot have deduced return type
virtual auto func() { return 1; }
}
戻るタイプの導出は、順方向宣言で使用できますが、それらを使用する前に、翻訳ユニットには関数定義が必要です。
auto f(); // declared, not yet defined
auto f() { return 42; } // defined, return type is int
int main() {
cout << f() << endl;
}
戻りタイプの導出は、再帰関数で使用されてもよいが、再帰的呼び出しは、少なくとも1つの戻り文を先頭にしてコンパイラが返すタイプを導出する必要がある。
auto sum(int i) {
if (i == 1)
return i; // return int
else
return sum(i - 1) + i; // ok
}
lambadaパラメータautC+11では、lamda表現パラメータは具体的なタイプ宣言を使用する必要があります。
auto f = [] (int a) { return a; }
C+14では、これを最適化して、lambada式パラメータは直接autであってもよい。
auto f = [] (auto a) { return a; };
cout << f(1) << endl;
cout << f(2.3f) << endl;
変数テンプレートC+14は変数テンプレートをサポートします。
template<class T>
constexpr T pi = T(3.1415926535897932385L);
int main() {
cout << pi<int> << endl; // 3
cout << pi<double> << endl; // 3.14159
return 0;
}
エイリアステンプレートC+14も別名テンプレートをサポートしています。
template<typename T, typename U>
struct A {
T t;
U u;
};
template<typename T>
using B = A<T, int>;
int main() {
B<double> b;
b.t = 10;
b.u = 20;
cout << b.t << endl;
cout << b.u << endl;
return 0;
}
constexprの制限C+14はC+11のconstexprに比べていくつかの制限を減らしました。
C++11でconstexpr関数は再帰的に使用でき、C+14でローカル変数とループが使用できます。
constexpr int factorial(int n) { // C++14 C++11
return n <= 1 ? 1 : (n * factorial(n - 1));
}
C+14ではこうしてもいいです。
constexpr int factorial(int n) { // C++11 ,C++14
int ret = 0;
for (int i = 0; i < n; ++i) {
ret += i;
}
return ret;
}
C+11のconstexpr関数はすべてのものを一つの別々のreturn文に入れなければなりません。constexprはこの制限がありません。
constexpr int func(bool flag) { // C++14 C++11
return 0;
}
C+14では、このようにすることができます。
constexpr int func(bool flag) { // C++11 ,C++14
if (flag) return 1;
else return 0;
}
[deprecated]マークC++14にdeprecatedマークが追加されました。クラスの変更、関数などは、プログラムに修飾されたコードが使用された場合、コンパイルされたときに警告が発生します。ユーザーは、開発者にこのマークが修飾された内容は将来破棄される可能性があります。なるべく使わないようにしてください。
struct [[deprecated]] A { };
int main() {
A a;
return 0;
}
コンパイルすると、次のような警告があります。
~/test$ g++ test.cc -std=c++14
test.cc: In function ‘int main()':
test.cc:11:7: warning: ‘A' is deprecated [-Wdeprecated-declarations]
A a;
^
test.cc:6:23: note: declared here
struct [[deprecated]] A {
バイナリ文字数と整形文字数の区切り子C+14はバイナリ字面量を導入しています。セパレータも導入しています。目がくらむのを防止します。
int a = 0b0001'0011'1010;
double b = 3.14'1234'1234'1234;
std:make_unique私達はすべて知っています。C+11にstdがあります。shared、stdがない:make_uniqueは、C+14で改善されました。
struct A {};
std::unique_ptr<A> ptr = std::make_unique<A>();
std:sharred_timed_mutexとstd:shared_ロックC+14通過std:sharred_timed_mustexとstd:shared_ロックは読み書きロックを実現し、複数のスレッドを同時に読むことができるようにするが、書き込みスレッドは独立して実行しなければならず、書き込み操作は同時に読み取り操作と一緒に行うことができない。
実現方法は以下の通りです。
struct ThreadSafe {
mutable std::shared_timed_mutex mutex_;
int value_;
ThreadSafe() {
value_ = 0;
}
int get() const {
std::shared_lock<std::shared_timed_mutex> loc(mutex_);
return value_;
}
void increase() {
std::unique_lock<std::shared_timed_mutex> lock(mutex_);
value_ += 1;
}
};
なぜタイムアウト時間を持つことができますので、具体的には自分で関連資料を調べられます。std::integer_sequence
template<typename T, T... ints>
void print_sequence(std::integer_sequence<T, ints...> int_seq)
{
std::cout << "The sequence of size " << int_seq.size() << ": ";
((std::cout << ints << ' '), ...);
std::cout << '
';
}
int main() {
print_sequence(std::integer_sequence<int, 9, 2, 5, 1, 9, 1, 6>{});
return 0;
}
出力:7 9 2 5 1 9 1 6std::integer_sequenceとstd:tupleの配合使用:
template <std::size_t... Is, typename F, typename T>
auto map_filter_tuple(F f, T& t) {
return std::make_tuple(f(std::get<Is>(t))...);
}
template <std::size_t... Is, typename F, typename T>
auto map_filter_tuple(std::index_sequence<Is...>, F f, T& t) {
return std::make_tuple(f(std::get<Is>(t))...);
}
template <typename S, typename F, typename T>
auto map_filter_tuple(F&& f, T& t) {
return map_filter_tuple(S{}, std::forward<F>(f), t);
}
std::exchangeコードを直接見ましょう。
int main() {
std::vector<int> v;
std::exchange(v, {1,2,3,4});
cout << v.size() << endl;
for (int a : v) {
cout << a << " ";
}
return 0;
}
s wapと同じような役割をしていますが、その違いは何ですか?exchangeの実現を見ることができます。
template<class T, class U = T>
constexpr T exchange(T& obj, U&& new_value) {
T old_value = std::move(obj);
obj = std::forward<U>(new_value);
return old_value;
}
new_が見えますvalueの値はobjにあげましたが、new_に対してはありません。value賦値、ここではすでに知っていると思います。swapとの違いですよね。std:「quot ted」
C+14はstdを導入します。「quot」は文字列に二重引用符を追加して、直接コードを見ます。
int main() {
string str = "hello world";
cout << str << endl;
cout << std::quoted(str) << endl;
return 0;
}
コンパイル&出力:
~/test$ g++ test.cc -std=c++14
~/test$ ./a.out
hello world
"hello world"
C+14については、これらの新特性が導入されていると思います。次期予告:C+17の新特性について、引き続き注目してください。歓迎スターマークは見所で絶賛と転送します。参照リンク
https://en.cppreference.com/w/cpp/14
https://en.cppreference.com/w/cpp/language/function#Return_タイプdeduction.28 since_C.2 B.B 14.29
https://en.cppreference.com/w/cpp/language/lambda
https://en.cppreference.com/w/cpp/language/constexpr
https://en.cppreference.com/w/cpp/language/constexpr
ここで、C+14の新しい特性に関するすべての知識点をここで紹介します。C+14の新しい特性に関する内容は以前の文章を検索してください。または下記の関連記事を引き続きご覧ください。これからもよろしくお願いします。