Разве никакие круглые скобки на конструкторе без аргументов не являются стандартом языка?

Я компилировал программу C++ в Cygwin с помощью g ++, и у меня был класс, у конструктора которого не было аргументов. У меня были строки:

MyClass myObj();
myObj.function1();

И при попытке скомпилировать его, я получил сообщение:

error: request for member 'function1' in 'myObj', which is of non-class type 'MyClass ()()'

После небольшого исследования я нашел, что фиксация должна была изменить ту первую строку на

MyClass myObj;

Я мог поклясться, что сделал объявления пустого конструктора с круглыми скобками в C++ прежде. Это - вероятно, ограничение компилятора, я использую или делаю стандарт языка, действительно говорят, не используют круглые скобки для конструктора без аргументов?

49
задан Benjamin Christoffersen 27 May 2018 в 11:30
поделиться

8 ответов

Всегда начинается с измерения. Пока вы не знаете, где какие-то узкие места, вы не знаете, что улучшить. «Даже не просмотрев какие-либо данные о производительности» вы вряд ли сделаете правильный звонок - или, по крайней мере, я часто нахожу, что я делаю неверные догадки о том, где производительность вредит. Может быть, вы лучше догадываетесь, чем я:) (Конечно, это вполне может быть в базе данных в вашем коде...)

Измерительные инструменты могут быть такими же простыми, как операторы журнала, чтобы увидеть, сколько времени занимает различные типы запросов, к полным профилировщикам, анализаторам запросов и т.д. На стороне базы данных вы почти наверняка захотите использовать ПОЯСНИТЬ для просмотра планов выполнения запроса... но перед этим вы захотите узнать, какие запросы вредят вам в первую очередь, и более того, какие запросы к самой веб-службе являются дорогостоящими.

-121--4667582-

Стандарт не требует круглых скобок.

int* x = new int;

- правовой синтаксис.

В вашем случае myobj (); является прототипом функции. В то время как myobj; является переменной.

-121--1070118-

Хотя MyClass myObj (); может быть проанализировано как определение объекта с пустым инициализатором или объявлением функции, стандарт языка указывает, что неоднозначность всегда разрешается в пользу объявления функции. Инициализатор в пустых скобках допускается в других контекстах, например, в выражении new или при создании временного инициализируемого значением .

54
ответ дан 7 November 2019 в 11:21
поделиться

Это называется самой сложной проблемой парсинга. Когда парсер видит

MyClass myObj();

он думает, что вы объявляете функцию под названием myObj, которая не имеет параметров и возвращает MyClass.

Чтобы обойти это, используйте:

MyClass myObj;
52
ответ дан 7 November 2019 в 11:21
поделиться

Это является довольно известной проблемой и не зависит от компилятора. По сути, вы объявляли функцию, возвращающую тип MyObj. Неудивительно, что вы не могли вызвать ее конструктор. См. C ++ faq lite за хорошее объяснение

10
ответ дан 7 November 2019 в 11:21
поделиться

Еще один самый-вечный-разбор. Смотрите, например, Sort function does not work with function object created on stack?

4
ответ дан 7 November 2019 в 11:21
поделиться

Ваша строка заставляет компилятор думать, что вы объявляете функцию с именем myObj , которая не принимает аргументов и возвращает MyClass . Это разрешение двусмысленности действительно раздражает.

3
ответ дан 7 November 2019 в 11:21
поделиться

Стандарт не требует скобок.

int* x = new int;

- это допустимый синтаксис.

В вашем случае myclass myobj (); является прототипом функции. В то время как myclass myobj; - это переменная.

1
ответ дан 7 November 2019 в 11:21
поделиться

Я нашел это в стандарте C++ (§8.5.8):

Объект, инициализатором которого является пустой набор круглых скобок, т.е. (), должен быть инициализирован значением.

[Примечание: поскольку () не допускается синтаксис для инициализатора,

X a ();

является не объявлением объекта класса X, а объявление функции, не принимающей аргумента и возвращающей X. Форма () допускается в некоторых других контекстах инициализации (5.3.4, 5.2.3, 12.6.2). -конец примечания ]

19
ответ дан 7 November 2019 в 11:21
поделиться
MyClass myObj();

Это проанализировано как объявление функции, функция называется myObj, не принимает аргументов и возвращает объект MyClass. Я никогда не видел, чтобы компилятор принимал это. С другой стороны, MyClass * myPtr = new MyClass (); приемлемо, может быть, это вас запутало?

4
ответ дан 7 November 2019 в 11:21
поделиться
Другие вопросы по тегам:

Похожие вопросы: