链调用成员函数关闭一个命名对象的构造函数

问题描述:

首先,我不是在谈论C++ 11构造函数链构造函数代理。链调用成员函数关闭一个命名对象的构造函数

类成员函数可以返回对自身(类)的引用,因此可以链接函数调用。 (例如,运营商如何工作以允许连锁呼叫。)

当实例化一个匿名对象时,此类链调用可能发生在构造函数外。

链调用可以从命名对象的构造函数创建吗?下面的“foo a”和“foo b”的行不能编译,所以我想知道是否有不同的语法。

#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();' –

你可以得到一个类似的效果链初始化:

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

出人意料的是,我的编译器优化是一个常数,所以没有性能损失。

我认为这是Almost Always Auto风格的优点之一。如果你在写作的习惯:

auto a = foo{3}; 

那么你可以调用链不矛盾:

auto a = foo{3}.inc();