Рассмотрим следующий код:
struct S
{
S() {}
void f();
private:
S(const S&);
};
int main()
{
bool some_condition;
S my_other_S;
(some_condition ? S() : my_other_S).f();
return 0;
}
gcc не может это скомпилировать, говоря:
test.cpp: In function 'int main()':
test.cpp:6:5: error: 'S::S(const S&)' is private
test.cpp:13:29: error: within this context
Я не понимаю, почему в этой строке должно происходить создание копии - цель состоит в том, чтобы просто вызвать f ()
либо в созданном по умолчанию экземпляре S
, либо в my_other_S
, т.е. он должен быть эквивалентен:
if (some_condition)
S().f();
else
my_other_S.f();
Чем отличается в первом случае и почему требуется ли конструктор копирования?
EDIT : Есть ли способ выразить «выполнить эту операцию над временным объектом на уже существующем объекте» в контексте выражения?