Меня немного смущает static
инициализация в классе члена const
. Например, в приведенном ниже коде:
#include <iostream>
struct Foo
{
const static int n = 42;
};
// const int Foo::n; // No ODR
void f(const int& param)
{
std::cout << param << std::endl;
}
int g(const int& param)
{
return param;
}
template<int N>
void h()
{
std::cout << N << std::endl;
}
int main()
{
// f(Foo::n); // linker error, both g++/clang++
std::cout << g(Foo::n) << std::endl; // OK in g++ only with -O(1,2 or 3) flag, why?!
h<Foo::n>(); // this should be fine
}
Foo::n
не определяю (строка закомментирована). Итак, я ожидаю, что вызов f(Foo::n)
завершится ошибкой во время компоновки, и это действительно так. Однако следующая строка std::cout << g(Foo::n) << std::endl;
компилируется и компонуется нормально только с помощью gcc (clang по-прежнему выдает ошибку компоновщика) всякий раз, когда я использую флаг оптимизации, такой как -O1/2/3
.
- Почему gcc (пробовали с gcc 5.2.0 и gcc 4.9.3) компилирует и связывает код, когда оптимизация включена?
- И правильно ли я говорю, что члены static const внутри класса используются только в константных выражениях, таких как параметры шаблона, как в вызове
h<Foo::n>
, и в этом случае код должен быть связан?
-std=c++11
, но сам по себе вопрос не обязательно касается только C++11 (или C++14). O наблюдал такое же поведение и с-std=c++98
. - person vsoftco   schedule 28.09.2015