2013-09-10 3 views
7
struct A 
{ 
    A() {} 

private: 
    A(const A&); // Explicitly disable the copy constructor. 
}; 

int main() 
{ 
    const A a1; // OK. 
    A  a2; // OK. 
    auto a3 = const_cast<A&>(a1); // Compiler error C2248! ???  
} 

Мой компилятор C++ является последним предварительным просмотром VC++ 2013.Почему const_cast не ведет себя так, как ожидалось?

Компилятор жалуется на последней строке с ошибкой C2248: «A :: A»: не может получить доступ к закрытому члену, объявленный в классе «А»

Почему const_cast себя не так, как ожидалось?

ответ

13

auto, сам по себе, никогда не является ссылочным типом. Таким образом, последняя строка эквивалентна

A a3 = const_cast<A&>(a1); 

, который пытается скопировать a1 с помощью закрытого конструктора.

Если вы хотите ссылку, необходимо указать ссылку:

auto & a3 = const_cast<A&>(a1); 

Конечно, попытка использовать эту ссылку для изменения a1 даст неопределенное поведение, так как сам объект const.

+0

Это означает, что 'const_cast' генерирует новые объекты? – lulyon

+5

@lulyon: нет; результат 'const_cast ' является ссылкой на существующий объект. Объявление объекта генерирует новый объект, и это то, что 'auto a = whatever;' делает (независимо от того, является ли это '' 'или' ') ссылкой. –

Смежные вопросы