2016-09-25 8 views
8

まずは、コンストラクタの委譲とも呼ばれるC++ 11のコンストラクタについて説明しません。連鎖呼び出しメンバは名前付きオブジェクトのコンストラクタで機能しません

クラスメンバ関数は、自身(クラス)への参照を返すことができるので、関数呼び出しを連結することができます。 (例えば、< <オペレータが連鎖呼び出しを許可するように動作するように)。

匿名オブジェクトをインスタンス化するとき、そのような連鎖呼び出しはコンストラクタから発生する可能性があります。

名前付きオブジェクトのコンストラクタから連鎖呼び出しを行うことはできますか?下の "foo a"と "foo b"の行はコンパイルされないので、別の構文があるかどうか疑問に思っています。

foo c = foo{5}.inc().inc(); 

は驚くべきことに、私のコンパイラは、一定にするので、パフォーマンスの低下がないことを最適化:

#include <iostream> 
using namespace std; 

class foo { 
    public: 
     foo(int x) : val{x} { }; 
     foo& inc() { ++val; return *this; } 
     int getVal() { return val; }; 
    private: 
     int val; 
}; 

int main() { 
    cout << foo(1).inc().getVal() << endl; // prints 2 
    cout << foo{2}.inc().inc().inc().inc().getVal() << endl; // prints 6 
    foo a(3).inc(); // error: expected ‘,’ or ‘;’ before ‘.’ token 
    foo b{4}.inc(); // error: expected ‘,’ or ‘;’ before ‘.’ token 
    cout << a.getVal() << endl; 
    cout << b.getVal() << endl; 
} 
+3

基本的に「ノー」。 'foo(1)'は式で、 'foo a(3)'は式ではありません。 'foo a(3);と書く必要があります。 a.inc(); ' –

答えて

2

あなたは、チェーンの初期化と同様の効果を得ることができます。

2

これは、Almost Always Autoスタイルの利点の1つだと思います。あなたが執筆の習慣にしている場合:矛盾のない

auto a = foo{3}; 

、あなたのことができチェーンコール:

auto a = foo{3}.inc(); 
関連する問題