Здравствуйте, гость ( Вход | Регистрация )
Влад | Дата 16.7.2010, 11:45 |
Эта особенность синтаксиса описана у Скотта Мейерса в его "Эффективное использование STL" - Совет 6: Остерегайтесь странностей лексического разбора C++. | |
DEADHUNT | Дата 14.7.2010, 18:27 |
вот в чём дело: 7 Another ambiguity arises in a parameter-declaration-clause of a function declaration, or in a type-id that is the operand of a sizeof or typeid operator, when a type-name is nested in parentheses. In this case, the choice is between the declaration of a parameter of type pointer to function and the declaration of a parameter with redundant parentheses around the declarator-id. The resolution is to consider the type-name as a simple-type-specifier rather than a declarator-id. [ Example:
Еще подсказали. Достаточно выражение в r1 и r2 заключить еще в одни скобки и неоднозначность пропадет. этим исключается возможность выбора simple type-specifier. |
|
ЙаМайскЫйПчОЛ | Дата 14.7.2010, 17:17 |
Этож... 3.14дец Так всетаки он это чуствовал как прототип функции??? А то у нас тут работа остановилась. |
|
Алексей1153 | Дата 14.7.2010, 14:13 |
мдя, ночь без сна сказалась )) Где вы увидели конструктор копирования? Он явно не определён. Да, это я протупил. Там тип ссылки же не A r2 и r4 тоже нигде далее по коду не используются. Да, теперь вижу Сорри за дезинформацию |
|
igor_bogomolov | Дата 14.7.2010, 13:14 |
Еще подсказали. Достаточно выражение в r1 и r2 заключить еще в одни скобки и неоднозначность пропадет. | |
DEADHUNT | Дата 14.7.2010, 13:09 |
в С++ нельзя функцию объявить внутри другой (например, в main). Поэтому здесь всё однозначно. объявлять можно(declare), определять нельзя(define). в стандарте также упоминается о неоднозначностях c с примерами - 6.8 Ambiguity resolution 8.3.6 Default arguments: .... 5. A default argument expression is implicitly converted (Clause 4) to the parameter type. The default argu- ment expression has the same semantic constraints as the initializer expression in a declaration of a variable of the parameter type, using the copy-initialization semantics (8.5). The names in the expression are bound, and the semantic constraints are checked, at the point where the default argument expression appears. Name lookup and checking of semantic constraints for default arguments in function templates and in mem- ber functions of class templates are performed as described in 14.7.1. [ Example: in the following code, g will be called with the value f(2): с этим загнался. |
|
igor_bogomolov | Дата 14.7.2010, 12:36 |
должен 4 раза вызваться - все 4 раза конструктор копирования (поскольку он явно определён) Где вы увидели конструктор копирования? Он явно не определён.строчки Вы не внимательно прочитали мое первое сообщение. r2 и r4 тоже нигде далее по коду не используются. Тем не менее они не с оптимизированны, как вы это объясните? С r3 вообще икаких проблем нет. Игнорируются r1 и r2.A r1(std::string(v[1])); и A r3(s); проигнорированы оптимизатором, так как эти локальные переменные нигде далее не использованы Цитата(DEADHUNT) Это связано с неоднозначностью, компилятор не может отличить декларацию прототипа функции от объявления переменной. Цитата(DIMEDROLL) 1>\testprocload.cpp(32) : warning C4930: 'A r1(std::string [])': prototyped function not called (was a variable definition intended?) 1>\testprocload.cpp(35) : warning C4930: 'A r2(std::string)': prototyped function not called (was a variable definition intended?) Спасибо, теперь понятно. |
|
Алексей1153 | Дата 14.7.2010, 7:55 |
должен 4 раза вызваться - все 4 раза конструктор копирования (поскольку он явно определён) строчки A r1(std::string(v[1])); и A r3(s); проигнорированы оптимизатором, так как эти локальные переменные нигде далее не использованы. Можно вывести их значение в поток тоже, чтобы они "остались", либо отрубить оптимизацию (а в дебаге должно само остаться, кстати) Это связано с неоднозначностью, компилятор не может отличить декларацию прототипа функции от объявления переменной. Ну ну С каких в C++ стало можно объявлять локальные функции ? [offtop] A r1(std::string(v[1])); может рассматриваться как функция A r1(std::string) с параметром по умолчанию v[1] и т. д. а если бы это и было прототипом, то синтаксис неверен - какой ещё тут параметр по умолчанию ? std::string() - это конструктор класса std::string. А параметр по умолчанию пишется после "=" [/offtop] Что значит нельзя? ты объявил не функцию, сделал предопределение глобальной функции foo ИМХО
Хотя, студия, к примеру, не позволила бы сделать это внутри функции )) |
|
DIMEDROLL | Дата 14.7.2010, 7:29 |
вижуал студия сразу выдает предупреждение: Цитата 1>\testprocload.cpp(32) : warning C4930: 'A r1(std::string [])': prototyped function not called (was a variable definition intended?) 1>\testprocload.cpp(35) : warning C4930: 'A r2(std::string)': prototyped function not called (was a variable definition intended?) Цитата в С++ нельзя функцию объявить внутри другой (например, в main). Что значит нельзя?
отлично компилится |
|
Litkevich Yuriy | Дата 14.7.2010, 7:19 |
может рассматриваться как функция A r1(std::string) в С++ нельзя функцию объявить внутри другой (например, в main). Поэтому здесь всё однозначно.Если я правильно понял, то речь про такой код:
|
|
Просмотр темы полностью (откроется в новом окне) | |
Текстовая версия | Сейчас: 28.3.2024, 15:03 |