Это не дубликат самого неприятного синтаксического анализа: почему A a(()); work?, который основан на синтаксическом анализе в форме A a(());
, чей OP считает, что он сможет построить объект A
по умолчанию, используя дополнительный набор скобок.
Напротив, мой вопрос касается двух классов, f
и g
, где f
имеет конструктор по умолчанию, а ctor g
принимает f
. Я хочу вызвать ctor g
с временным аргументом f
, и все это без использования единого синтаксиса инициализации. В ctor g
есть оператор std::cout
, поэтому отсутствие вывода означает объявление функции вместо создания экземпляра объекта g
. Я аннотировал пример кода тремя цифрами в комментариях. №1 и №2 были скомпилированы с закомментированным №3, и наоборот:
#include <iostream>
struct f {};
struct g {
g(f) { std::cout << "g's ctor\n"; }
};
int main() {
// -----Output-----
g( f() ); // #1: function declaration; expected
g( ( f() ) ); // #2: also a function declaration; UNEXPECTED
// g myG( ( f() ) ); // #3: "g's ctor" ONLY if #1 & #2 are commented out;
// ^ ... linker error otherwise
}
#1: я думал, что #1 объявляет анонимную функцию, которая возвращает g
и принимает указатель на функцию, которая принимает 0 аргументов и возвращает f
. Я ошибаюсь?
#2: Итак, я подумал, что дополнительный набор круглых скобок в #2 заставит оцениваться заключенное в нем содержимое как вызов функции, а именно вызов ctor по умолчанию f
. Но это все еще объявление функции. Почему?
№3: — это вариант №2, отличающийся тем, что в №3 добавлено имя экземпляра myG
. #3 создает экземпляр объекта, если #1 и #2 закомментированы. В противном случае я получаю эти ошибки в VC12:
error LNK2019: unresolved external symbol "struct g __cdecl f(void)" (?f@@YA?AUg@@XZ) referenced in function _main
и
fatal error LNK1120: 1 unresolved externals
.
и эта ошибка в g++ 4.8: undefined reference to 'f()'
Что они означают и почему я их получаю?
Почему # 3 является экземпляром объекта только тогда, когда экземпляр назван?
Как я могу получить желаемый эффект создания экземпляра, не называя экземпляр или используя юниформ-инициализацию?
g
как функцию. поэтому это не может быть переменнаяg
, как вы хотите в третьем случае (а также объясняет, почему она компилируется, когда исключаются и #1, и #2). Однако второй (№ 2) все еще вызывает у меня недоумение. Должен смириться с этим на минутку. - person WhozCraig   schedule 18.12.2013