2013-11-21 3 views
1

я собирался в течение следующего примера, что делает присутствие и означает в const_cast параметра шаблона

const int a = 12; 
int b; 
b = const_cast<int&>(a); 

, и я хотел бы знать, что & в типе параметра шаблона означает выше, и поэтому он не будет работать без & ?

Update:

Позвольте мне перефразировать мой вопрос. Я понимаю его ссылку, но какую переменную она имеет в виду? Например, here указывает на то, что incase указателей ссылается на исходный (uncast) указатель. Я хочу знать, что он ссылается на типы без указателей и как может быть ссылка, если она не была объявлена ​​как ссылка?

+0

Если вы не признаете ссылку, вы, вероятно, должны сделать шаг назад и прочитать хороший начинающий C++ good/tutorial. –

+0

Его значение ... дождаться его ... ** Ссылка! ** –

+0

Позвольте мне перефразировать мой вопрос. Я знаю его ссылку, но какую переменную она имеет в виду? Например, в msdn.microsoft.com/en-us/library/bz6at95h%28v=vs.110%29.aspx указывается, что без указателей он ссылается на исходный (uncast) указатель. Я хочу знать, что он ссылается на типы без указателей – MistyD

ответ

3

const_cast не шаблон, а тип литой. То, что кажется аргументом шаблона, является тип назначения для трансляции, и в этом случае это означает, что вы хотите получить неконстантную ссылку на int, которая относится к тем же объектам, что и a.

+0

Значит, тип назначения является ссылкой, я правильно? Если да, то что это за ссылка? - временный объект, созданный в памяти? Я попробовал это с указателями и http://msdn.microsoft.com/en-us/library/bz6at95h%28v=vs.110%29.aspx заявляет, что он ссылается на исходный (uncast) указатель. Я хочу знать, что происходит без инсайдеров. – MistyD

+0

@MistyD: Он ссылается на объект, являющийся аргументом для трансляции. –

+0

Я все еще запутался в том, как он может ссылаться на что-то, когда он объявлен как 'int b', а не как' int & b' – MistyD

1

a is const int&, когда вы делаете const_cast, как вы написали.

Вы можете изменять только cv-квалификаторы указателей и ссылочных типов с помощью const_cast, а не значений. Это связано с тем, что указание константы для rvalues ​​имеет смысл только в том случае, если это ссылочный или указательный тип и, следовательно, может быть изменен.

Так что, если вы просто хотите, значение (неконстантную) переменной a, просто написать

b = a; 

как сопзЬ-ность игнорируется в любом случае. b затем копируется из a.

+1

* constness игнорируется для значений *? Возможно, вы захотите еще больше объяснить, что вы имеете в виду, поскольку это неверно. –

+0

@ DavidRodríguez-dribeas Я исправил его до «rvalues», теперь это правильно? Я имею в виду, что когда я использую значение const в выражении (rvalue?), Его константа не имеет значения. Только когда я пытаюсь назначить ему (lvalue?). Но, может быть, я не знаю правильной терминологии для этого. – leemes

+0

в первой строке вы написали 'a is const int &' вы могли бы вывести то, что это значит? поскольку мой код имеет 'const int' – MistyD

0

В основном это сопзЬ, б не сопзИте

так const_cast в основном говорит, что б хранятся в а, но удаляет Уста.