まずは、コンストラクタの委譲とも呼ばれる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;
}
基本的に「ノー」。 'foo(1)'は式で、 'foo a(3)'は式ではありません。 'foo a(3);と書く必要があります。 a.inc(); ' –