crossplatform.ru

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

> Вопрос по с++, Помогите понять суть
igor_bogomolov
  опции профиля:
сообщение 13.7.2010, 23:34
Сообщение #1


Профессионал
*****

Группа: Сомодератор
Сообщений: 1215
Регистрация: 22.3.2009
Из: Саратов
Пользователь №: 630

Спасибо сказали: 235 раз(а)




Репутация:   29  


Вопрос из теста.
Раскрывающийся текст
#include <string>

class A
{
public :
      A(const std::string & s) : m_name(s) {}
      ~A() { }
private :
      std::string m_name;
};

int main(int c, char ** v)
{
      A r1(std::string(v[1]));

      const char * e = "Hello";
      A r2(std::string(e));
      std::string s(e);

      A r3(s);
      A r4(std::string("World"));
      return 0;../test/main.cpp:25: ошибка: запрос элемента ‘m_name’ в ‘r2’, имеющего не классовый тип ‘A(std::string)’ [quote][/quote]
}

Вопрос в тесте такой - сколько раз вызовется конструктор класса A при исполнении функции main. После ответа откомпилируй код для проверки, добавив какой-нибудь std::cout в конструктор A.

При первом просмотре (да и при втором, третьем, ...) я предположил, что конструктор вызовится 4 раза. Откомпилировав, получил всего два вызова. Пробовал воспользоваться отладчиком и впал в недоумение. r1 и r2 вообще не создаются, т.е. при компиляции эти строчки игнорируются. Сделал m_name публичным и попробовал обратиться к нему после создания r1. Получил ошибку компиляции
Цитата
ошибка: запрос элемента ‘m_name’ в ‘r1’, имеющего не классовый тип ‘A(std::string)’
При этом r3 и r4 создаются нормально и обращение к m_name не приводит к ошибке.

Помогите разобраться что происходит
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
 
Начать новую тему
Ответов
DEADHUNT
  опции профиля:
сообщение 14.7.2010, 13:09
Сообщение #2


Активный участник
***

Группа: Участник
Сообщений: 430
Регистрация: 15.4.2009
Пользователь №: 686

Спасибо сказали: 26 раз(а)




Репутация:   2  


Цитата(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):

с этим загнался.

Сообщение отредактировал DEADHUNT - 14.7.2010, 13:17
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

Сообщений в этой теме


Быстрый ответОтветить в данную темуНачать новую тему
Теги
Нет тегов для показа


1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0




RSS Текстовая версия Сейчас: 28.3.2024, 18:02