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). Вот и все.
Предположим, есть класс, конструктор которого принимает только один аргумент, и тип этого аргумента - это другой класс с конструктором по умолчанию. E.g.:
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 (()); работа .
Спасибо, sbi.