Литеральная инициализация для ссылок константы

Как следующее кодирует работу в C++? Действительно ли это логично?

const int &ref = 9;
const int &another_ref = ref + 6;

Почему C++ позволяет литеральную инициализацию для ссылок константы, когда то же не разрешено для ссылок неконстанты? Например:

const int days_of_week = 7;
int &dof = days_of_week; //error: non const reference to a const object

Это может быть объяснено тем, что, ссылка неконстанты может использоваться для изменения значения переменной, к которой это относится. Следовательно, C++ не разрешает ссылку неконстанты на переменную константы.

Это могло быть возможным объяснением? C++ не позволяет:

int &ref = 7;

Поскольку это не логично, но:

const int &ref = 7;

Почти эквивалентно:

const int val = 7;

Таким образом, литеральная инициализация разрешена для переменных константы.

P.S.: я в настоящее время изучаю Краткую информацию C++ Lippman.

18
задан Nikit Batale 18 January 2010 в 19:10
поделиться

3 ответа

Итак, вы можете написать код как это:

void f( const string & s ) {
}

f( "foobar" );

, хотя и строго говоря, что на самом деле происходит здесь, не является буквальным, связанным с записью Const - вместо этого создается объект Strone Temprary:

string( "foobar" );

И эта безымянная строка связана со ссылкой.

Обратите внимание, что на самом деле довольно необычно создание непараметрических ссылочных переменных, поскольку вы выполняете - основной целью ссылок - это служить в качестве параметров функций и возвращаемых значений.

11
ответ дан 30 November 2019 в 08:38
поделиться

Только для записи, вот еще один сценарий:

# Author: Steve Stock
# http://www.linuxjournal.com/article/7385 (comments)

shmore() {
LINES=""
while read -d $'\n' line; do
  printf "%s\n" "$line"
  #echo "$line"
  LINES=".${LINES}"
  if [[ "$LINES" == "......................." ]]; then
     echo -n "--More--"
     read < /dev/tty
     LINES=""
  fi
done
return 0
}


shmore < file.txt

найден здесь: http://codesnippets.joyent.com/posts/show/1788

-121--3815251-

Мобильный IE, кажется, уважает метатег видового экрана, только если вы указываете фактическую ширину. Чтобы ширина страницы соответствовала фактической ширине устройства, используйте метатег mobileoptimized с содержимым 0:

< meta name = «mobileoptimized» content = «0 »/>

Подробные сведения о MSDN: http://msdn.microsoft.com/en-us/library/dd938878.aspx

Если вы объединяете его с метатегом viewport, как описано выше, то, что вы ищете в большинстве мобильных браузеров.

-121--3950627-

Ваш код сводится к стандартному правилу C++, где срок действия временного значения привязан к сроку действия ссылки const , которой он присвоен. Для получения дополнительной информации см. статью GoTW GotW # 88: A Candidate for the «Most Agency Const» .

От этого поведения зависит, например, реализация ScopeGuard , описанная Александреску и Маргинем в статье доктора Доббса « Generic: Change the Пути You Write Exception-Safe Code - Forever ».

2
ответ дан 30 November 2019 в 08:38
поделиться

Постоянные ссылки могут быть инициализированы литералами и временными, потому что вы можете триветично преобразовать их в явные переменные:

int const& ans = 42;
// tranformed:
int __internal_unique_name = 42;
int const& ans = __internal_unique_name;

или когда срок службы не расширяется, например, параметр функции:

f("foobar");
// transformed:
{
  string __internal_unique_name = "foobar";
  f(__internal_unique_name);
}

Обратите внимание на явный блок в этом случае.)

В то время как можно сделать что-то похожее в непостоянном случае, это просто не допускается в CURRRCT C ++. C ++ 0x (следующий стандарт), однако, будут иметь ссылки R-значения.


Если было не понятно, Ref + 6 из вашего кода создает временный объект, который вы можете визуализировать как:

int const& ref = int(9);
int const& another_ref = int(ref + 6);

// transformed:
int __A = 9;
int const& ref = __A;
int __B = ref + 6;
int const& another_ref = __B;

Это может помочь вам понять / визуализировать то, что происходит, но вы должны Не пишите настоящий код, как это. Также я использовал двойные имена подчеркивания, чтобы проиллюстрировать эти имена, являются деталями реализации (используемые компилятором) и не должны использоваться вами. Любое название, которое содержит соседние подчеркивания, зарезервировано в реализации C ++.

11
ответ дан 30 November 2019 в 08:38
поделиться
Другие вопросы по тегам:

Похожие вопросы: