链调用成员函数关闭一个命名对象的构造函数
问题描述:
首先,我不是在谈论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;
}
答
你可以得到一个类似的效果链初始化:
foo c = foo{5}.inc().inc();
出人意料的是,我的编译器优化是一个常数,所以没有性能损失。
基本上都是“不”。 'foo(1)'是一个表达式,'foo a(3)'不是一个表达式。你必须写'foo a(3); a.inc();' –