Рассмотрим следующий код:
const int a = 0;
const std::string b = "hi";
inline void f_a1()
{
std::cout << a;
}
inline void f_b1()
{
std::cout << b;
}
inline void f_a2()
{
std::cout << &a;
}
inline void f_b2()
{
std::cout << &b;
}
Предположим, что этот код существует в заголовочном файле, который будет включен в несколько единиц перевода.
Мое понимание встроенных функций заключается в том, что они должны быть одинаковыми в каждой единице перевода.
Мое понимание констант, использованных выше, заключается в том, что они неявно static
т.е. внутренняя связь. Это означает, что каждая единица перевода получает свою собственную копию.
Поскольку приведенные выше встроенные функции полагаются на эти константы, какие из этих функций верны?
f_a1
иf_b1
верны, потому что они относятся к значению константы. Даже если компилятор создаст более одной константы, все они будут иметь одинаковое значение. Таким образом, даже если разные экземпляры функций используют разные фактические константы, это не сломает ожиданий от кода (кстати, большинство компиляторов будут складывать константуint
непосредственно в сгенерированном коде, поэтому в вашей программе не будет фактической константыa
). Я думаю о двух других. - person Giulio Franco   schedule 27.02.2015f_a2
prf_b2
может быть неверным? - person Luchian Grigore   schedule 27.02.2015a
преобразуется в два разных объекта, и даже если два определения имеют одинаковую семантику, они не являются одним. Правила для константных выражений были изменены в С++ 11, и я не уверен, каково текущее состояние... Я верю, не уверен, что в С++ 11f_a1
может быть допустимым, я не думаю, что остальные - person David Rodríguez - dribeas   schedule 27.02.2015