- 追加された行はこの色です。
- 削除された行はこの色です。
#topicpath
//////////////////////////////////////////////////////////////////////////////
* 目次 [#pa168adc]
#contents();
//////////////////////////////////////////////////////////////////////////////
* C++11 のキーワード (取り敢えず関心のあるものだけ) [#m4713ac6]
//============================================================================
** スコープ付き列挙型(enum) [#rc87b048]
//============================================================================
** アライメントの指定 [#vb8529d6]
//============================================================================
** std::nullptr [#lb7c9c62]
//============================================================================
** 参照修飾子 [#re106fd3]
//============================================================================
** 移譲/継承 コンストラクタ [#rd52b5a3]
//============================================================================
** explicit な型変換演算子 [#o4c7c9aa]
//============================================================================
** ラムダ式 [#o22dfb12]
[キャプチャ] (仮引数リスト) -> 戻り値の型 { 関数の中身 };
- キャプチャ
-- ラムダ式から参照するオブジェクトを指定。ラムダ式の定義されたスコープにあるオブジェクトのうちでラムダ式が参照できるのは、キャプチャで指定されたものに限られる。
-- キャプチャは以下の2種類がある
--- 参照キャプチャ:オブジェクトが参照で渡される
--- コピーキャプチャ:実体のコピーが渡される
-- 記述方法
|~記述 |~意味 |
|[=] |全てをコピーキャプチャ。メンバ関数内の場合は this も対象となる |
|[&] |全てを参照キャプチャ |
|[hoge] |オブジェクト hoge をコピーキャプチャ |
|[&hoge] |オブジェクト hoge を参照キャプチャ |
|[=, &hoge] |オブジェクト hoge を参照キャプチャ、それ以外はコピーキャプチャ |
|[&, hoge] |オブジェクト hoge をコピーキャプチャ、それ以外は参照キャプチャ |
//============================================================================
** 属性 [#we1705b4]
- noreturn
-- 呼び出しても戻ってこない関数の記述に使用する
[[ noreturn ]] void f();
-- noreturn 属性を指定された関数が throw を送出すれば、その関数から「戻る」ことが可能。
-- noreturn 属性を指定された関数が return 文を実行したり、関数末尾に到達して呼び出し元に戻った場合の挙動は未定義。
- carries_dependency
-- 関数間でデータの依存性を伝播するために使用する
-- ''詳細は要確認''
//============================================================================
** 例外 [#w63a2c53]
*** 例外クラスの使い分け [#kb44dcdd]
*** 例外を創出しないことを明示する [#l975009b]
*** 例外ポインタ [#b703371f]
*** 入れ子の例外関連 [#if27cf02]
//============================================================================
** 文字列を数値に変換する [#jbebeab0]
//============================================================================
** 正規表現での検索 [#ff98d5c1]
- regex は g++4.7 では未実装なので動作しない(4.9で実装済みらしい)~
→ [[Bug 53631 - [C++11] <regex> is unimplemented>https://gcc.gnu.org/bugzilla/show_bug.cgi?id=53631]]
//============================================================================
** 浮動小数点数の入力 [#o476bddb]
//============================================================================
** 日付・時刻 [#o44a5361]
- #include <iomanip>
//============================================================================
** 乱数生成 [#mc805a6d]
- #include <random>
** shared_ptr (共有ポインタ) [#u9cdb048]
//============================================================================
** shared_ptr (共有ポインタ) [#shared_ptr]
- std::shared_ptr
- #include <memory>
- 通常のポインタ同様の操作が出来る
- 複数の std::shared_ptr が1つのリソースを指し示すことが出来る
- 同じリソースを参照する std::shred_ptr が1つもなくなった時、そのリソースは自動的に開放される
** unique_ptr [#u0c9fb94]
- 書式
T : shared_ptrとして使用したいclassの型とする
std::shared_ptr<T> 変数名( new T() [, reset_function] );
- 例
#include <iostream>
#include <memory>
#include "ClassA.h"
using namespace std;
int main( int argc, char* argv[] )
{
shared_ptr<ClassA> sp1( new ClassA ); // new したポインタから shared_ptr を構築
{
shared_ptr<ClassA> sp2 = sp1; // 2つの shared_ptr で1個のリソースを参照する
sp2->foo();
} // ここで sp2 が破棄され、参照している shared_ptr が1個になる
sp1->foo(); // 同じ実体の foo() の2回目の呼び出し
sp1->bar();
return( 0 );
}
//----------------------------------------------------------------------------
*** リソース開放時の処理の指定 [#l47120f9]
- リソースを開放するときの処理を指定することが出来る。
std::shared_ptr<T> 変数名( new T() [, reset_function] );
の reset_function に、リソース開放処理を行う関数を渡す。
- 例:
void custom_reset( FILE * pf ) {
if( pf ) {
fclose( pf );
pf = NULL;
}
}
int main( int argc, char * argv[] )
{
std::shared_ptr<FILE> sp_f( fopen( "file.txt", "+w" ), custom_reset );
...
return( 0 );
}
//----------------------------------------------------------------------------
*** std::shared_ptr::get() --- 組み込みポインタの取得 [#z3882f41]
std::shared_ptr<ClassA> up_a1;
ClassA *p_a1 = up_a1.get(); // up_a1 が持っている ClassA のリソースを指す組み込みポインタを取得
//----------------------------------------------------------------------------
*** std::make_shared() --- std::shared_ptr 構築のためのヘルパ関数 [#k8ecea9f]
- この関数は内部で new を行なっており、リソース構築に失敗した場合にリソースリークを起こさない特性を持っている。
- 例
class X {
public:
X( int i, std::string str ) {
m_i = i;
m_str = str;
}
private:
int m_i;
string m_str;
};
int main( int argc, char * argv[] )
{
std::shared_ptr<X> px = std::make_shared<X>( 10, "aaa" );
...
return( 0 );
}
//============================================================================
** unique_ptr [#unique_ptr]
- std::unique_ptr
- #include <memory>
- std::shared_ptr と同様、リソースをデストラクタによって自動的に開放させるための class
- ''コピーが出来ないようになっているため、リソースを参照しているオブジェクトが1つであることが保証される''
- C++03 までは std::auto_ptr があったが、C++11 では非推奨になった。
- 書式
std::unique_ptr<unique_ptrとして使用したいclassの型> 変数名
- 例
#include <memory>
class ClassX {
public:
ClassX() {
m_count_foo = 0;
};
virtual ~ClassX() {
std::cout << "Destroyed" << std::endl;
};
void foo() {
m_count_foo++;
std::cout << "Execute foo(): " << m_count_foo << std::endl;
}
private:
int m_count_foo;
};
// 参照する unique_ptr を変更する
void swap_unique_ptr( unique_ptr<ClassX> &up_src, unique_ptr<ClassX> &up_dst )
{
up_dst = move( up_src );
cout << "unique_ptr is moved up_src to up_dst" << endl;
}
int main( int argc, char* argv[] )
{
unique_ptr<ClassX> up1( new ClassX );
// ↓ unique_ptr は複数箇所から参照できない。これを書くとエラーになる
// unique_ptr<ClassX> up2 = up1;
up1->foo();
unique_ptr<ClassX> up2;
swap_unique_ptr( up1, up2 );
up2->foo();
up2 = nullptr; // これを実行した時点でリソースが開放される
cout << "Terminate Program" << endl;
return( 0 );
}
//----------------------------------------------------------------------------
*** std::move() --- unique_ptr の移動 [#xe4070f7]
- リソースを参照するオブジェクトを変更するには、 std::move() を使用する。
std::unique_ptr std::move( std::unique_ptr src );
//----------------------------------------------------------------------------
*** std::unique_ptr::get() --- 組み込みポインタの取得 [#z3882f41]
std::unique_ptr<ClassX> up_x1;
ClassX *p_x1 = up_x1.get(); // up_x1 が持っている ClassX のリソースを指す組み込みポインタを取得
//============================================================================
** 複数の値から、最大値または最小値を選択する [#hfd09405]
//============================================================================
** 2つの変数を入れ替える [#s458c40d]
//============================================================================
** コンパイル時にアサーションを行う [#db4bc5bc]
//============================================================================
** 浮動小数点数の四捨五入 [#a44e97e9]
//============================================================================
** 数学関数 [#b2da218a]
//============================================================================
** 関数オブジェクトを変数に持つ [#z1d24402]
- #include <functional>
//============================================================================
** 時間演算を行う [#j45d63eb]
- #include <chrono>
//============================================================================
** タプル [#g6c7a34b]
- #include <tuple>
//============================================================================
** システム終了 [#gf1533a6]
//============================================================================
** スレッド [#q6531554]
- → [[Lang/C++/C++11/thread]]
//////////////////////////////////////////////////////////////////////////////
* build (g++) [#r110442c]
- コンパイラオプションに "-std=c++11" または "-std=c++0x" の追加が必要となる場合がある