2016-09-25 2 views
8

Во-первых, я не говорю о создании конструктора конструктора C++ 11 aka.Функция, вызывающая цепочку, отключает конструктор именованного объекта

Функции члена класса могут возвращать ссылку на себя (класс), так что вызовы функций могут быть закодированы. (Как работает оператор 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; 
} 
+3

в основном «нет». 'foo (1)' - выражение, 'foo a (3)' не является выражением. Вам нужно написать 'foo a (3); a.inc(); ' –

ответ

2

Вы можете получить подобный эффект, что цепи инициализации:

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

Удивительно, но мой компилятор оптимизирован, что константа, поэтому не потери производительности.

2

Я думаю, что это одно из преимуществ стиля Almost Always Auto. Если вы находитесь в привычку написания:

auto a = foo{3}; 

, то вы можете цепи вызовов без несоответствия:

auto a = foo{3}.inc(); 
Смежные вопросы