crossplatform.ru

Здравствуйте, гость ( Вход | Регистрация )


  Ответ в Вопрос по с++
Введите ваше имя
Подтвердите код

Введите в поле код из 6 символов, отображенных в виде изображения. Если вы не можете прочитать код с изображения, нажмите на изображение для генерации нового кода.
 

Опции сообщения
 Включить смайлы?
Иконки сообщения
(Опционально)
                                
                                
  [ Без иконки ]
 


Последние 10 сообщений [ в обратном порядке ]
Влад Дата 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:
class C { };
void f(int(C)) { } // void f(int(*fp)(C c)) { }
                         // not: void f(int C);

int g(C);
void foo() {
f(1); // error: cannot convert 1 to function pointer
f(g); // OK
}
---]

A r1(std::string(v[1])); // A r1(std::string *v)
A r2(std::string(e)); // A r2(std::string e)



Цитата(igor_bogomolov @ 14.7.2010, 14:14) *
Еще подсказали. Достаточно выражение в r1 и r2 заключить еще в одни скобки и неоднозначность пропадет.

этим исключается возможность выбора simple type-specifier.
ЙаМайскЫйПчОЛ Дата 14.7.2010, 17:17
  Этож... 3.14дец
Так всетаки он это чуствовал как прототип функции???
А то у нас тут работа остановилась.
Алексей1153 Дата 14.7.2010, 14:13
  мдя, ночь без сна сказалась ))

Цитата(igor_bogomolov @ 14.7.2010, 15:36) *
Где вы увидели конструктор копирования? Он явно не определён.

Да, это я протупил. Там тип ссылки же не A

Цитата(igor_bogomolov @ 14.7.2010, 15:36) *
r2 и r4 тоже нигде далее по коду не используются.

Да, теперь вижу

Сорри за дезинформацию :)
igor_bogomolov Дата 14.7.2010, 13:14
  Еще подсказали. Достаточно выражение в r1 и r2 заключить еще в одни скобки и неоднозначность пропадет.
DEADHUNT Дата 14.7.2010, 13:09
 
Цитата(Litkevich Yuriy @ 14.7.2010, 8:19) *
в С++ нельзя функцию объявить внутри другой (например, в 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
 
Цитата(Алексей1153 @ 14.7.2010, 8:55) *
должен 4 раза вызваться - все 4 раза конструктор копирования (поскольку он явно определён)
Где вы увидели конструктор копирования? Он явно не определён.

Цитата(Алексей1153 @ 14.7.2010, 8:55) *
строчки
A r1(std::string(v[1]));
и
A r3(s);
проигнорированы оптимизатором, так как эти локальные переменные нигде далее не использованы
Вы не внимательно прочитали мое первое сообщение. r2 и r4 тоже нигде далее по коду не используются. Тем не менее они не с оптимизированны, как вы это объясните? С r3 вообще икаких проблем нет. Игнорируются r1 и r2.


Цитата(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);
проигнорированы оптимизатором, так как эти локальные переменные нигде далее не использованы. Можно вывести их значение в поток тоже, чтобы они "остались", либо отрубить оптимизацию (а в дебаге должно само остаться, кстати)

Цитата(igor_bogomolov @ 14.7.2010, 2:34) *
Это связано с неоднозначностью, компилятор не может отличить декларацию прототипа функции от объявления переменной.

Ну ну :) С каких в C++ стало можно объявлять локальные функции ?

[offtop]
Цитата(igor_bogomolov @ 14.7.2010, 2:34) *
A r1(std::string(v[1])); может рассматриваться как функция A r1(std::string) с параметром по умолчанию v[1] и т. д.

а если бы это и было прототипом, то синтаксис неверен - какой ещё тут параметр по умолчанию ? :) std::string() - это конструктор класса std::string. А параметр по умолчанию пишется после "="
[/offtop]



Цитата(DIMEDROLL @ 14.7.2010, 10:29) *
Что значит нельзя?

ты объявил не функцию, сделал предопределение глобальной функции foo ИМХО
int foo(int a);
    
int main(int c, char ** v)
{
    int r = foo(5);
    
    return 0;
}


int foo(int a){
    return a+=2;
}


Хотя, студия, к примеру, не позволила бы сделать это внутри функции ))
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).

Что значит нельзя?
int main(int c, char ** v)
{
    int foo(int a);

    int r = foo(5);

    return 0;
}

int foo(int a){
    return a+=2;
}

отлично компилится
Litkevich Yuriy Дата 14.7.2010, 7:19
 
Цитата(DEADHUNT @ 14.7.2010, 5:45) *
может рассматриваться как функция A r1(std::string)
в С++ нельзя функцию объявить внутри другой (например, в main). Поэтому здесь всё однозначно.
Если я правильно понял, то речь про такой код:
A r1(std::string(v[1]));
r1.m_name = "test";
Просмотр темы полностью (откроется в новом окне)
RSS Текстовая версия Сейчас: 18.5.2022, 6:26