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, 18:27
Сообщение #2


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

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

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




Репутация:   2  


вот в чём дело:
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.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

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


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


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




RSS Текстовая версия Сейчас: 18.5.2022, 6:53