Observation: the codes pasted below were tested only with GCC 4.4.1, and I'm only interested in them working with GCC.
Привет,
Я не раз сталкивался с непонятным оператором построения объекта, и только сегодня я заметил, какую двусмысленность он вносит. Я объясню, как это воспроизвести, и хотел бы знать, есть ли способ исправить это (разрешен C++0x). Вот оно.
Предположим, что есть класс, конструктор которого принимает только один аргумент, и тип этого одного аргумента является другим классом с конструктором по умолчанию. Например.:
struct ArgType {};
class Class
{
public:
Class(ArgType arg);
};
Если я попытаюсь построить объект типа Class
в стеке, я получу неоднозначность:
Class c(ArgType()); // is this an object construction or a forward declaration
// of a function "c" returning `Class` and taking a pointer
// to a function returning `ArgType` and taking no arguments
// as argument? (oh yeh, loli haets awkward syntax in teh
// saucecode)
Я говорю, что это конструкция объекта, но компилятор настаивает на том, что это предварительное объявление внутри тела функции. Для тех, кто еще не понял, вот полностью рабочий пример:
#include <iostream>
struct ArgType {};
struct Class {};
ArgType func()
{
std::cout << "func()\n";
return ArgType();
}
int main()
{
Class c(ArgType());
c(func); // prints "func()\n"
}
Class c(ArgType funcPtr()) // Class c(ArgType (*funcPtr)()) also works
{
funcPtr();
return Class();
}
Итак, достаточно примеров. Кто-нибудь может помочь мне обойти это, не делая ничего слишком антиидиоматического (я разработчик библиотек, а людям нравятся идиоматические библиотеки)?
-- редактировать
Неважно. Это обман Самый неприятный разбор: почему A a(() ); работать?.
Спасибо, сби.
Class
и передать его конструктору объект типаArgType
, созданный встроенным. Но он распознается как предварительное объявление. Я добавлю код, который я хотел заставить работать, но не могу, секундочку. - person Gui Prá   schedule 16.02.2010