Как следующее кодирует работу в 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.
Итак, вы можете написать код как это:
void f( const string & s ) {
}
f( "foobar" );
, хотя и строго говоря, что на самом деле происходит здесь, не является буквальным, связанным с записью Const - вместо этого создается объект Strone Temprary:
string( "foobar" );
И эта безымянная строка связана со ссылкой.
Обратите внимание, что на самом деле довольно необычно создание непараметрических ссылочных переменных, поскольку вы выполняете - основной целью ссылок - это служить в качестве параметров функций и возвращаемых значений.
Только для записи, вот еще один сценарий:
# 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 ».
Постоянные ссылки могут быть инициализированы литералами и временными, потому что вы можете триветично преобразовать их в явные переменные:
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 ++.