链调用成员在命名对象的构造函数之外运行

时间:2016-09-25 01:41:27

标签: c++ c++11 chaining method-chaining

首先,我不是在谈论c ++ 11构造函数链接也就是构造函数委托。

类成员函数可以返回对自身(类)的引用,因此可以链接函数调用。 (例如cout<<运算符如何允许链调用。)

实例化匿名对象时,可以在构造函数之外进行此类链调用。

可以通过命名对象的构造函数进行链调用吗?下面的“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;
}

2 个答案:

答案 0 :(得分:3)

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

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

令人惊讶的是,我的编译器将其优化为常量,因此没有性能损失。

答案 1 :(得分:3)

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

auto a = foo{3};

然后你可以没有不一致地链接呼叫:

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