Рассмотрим приведенные ниже определения.
char right_string[]="::right_one.";
char wrong_string[]="::wrong_one.";
template
void f(){
static_assert(str==::right_string, "Pass me ::right_string!");
}
struct Test{
static constexpr char right_string[]="template_struct::right_one";
static constexpr char wrong_string[]="template_struct::wrong_one";
template
static void f(){
static_assert(str==right_string, "Pass me template_struct::right_string!");
}
};
int main(){
f< ::right_string>(); //compiles, as expected
f< ::wrong_string>(); //does not compile, as expected
Test::f(); //compiles, as expected
Test::f(); //error in Test::f: non-constant condition for static assertion
}
Полная ошибка:
../main.cpp:16:3: ошибка: непостоянное условие для статического утверждения
../main.cpp:16:3: ошибка: '((( const char*)(& Test::wrong_string)) == ((const char*)(& Test::right_string)))' не является константным выражением
Я считаю, что это ошибка компилятора, потому что она не Не имеет смысла, что constexpr
выражение в static_assert
изменяется в зависимости от того, что я передаю в качестве параметра шаблона (будь то Test::right_string
или Test::right_string
).
Я уже обнаружил, что g++ 4.6 имеет некоторые недостаткипри обработке адресов в качестве параметров шаблона. Это один и тот же баг?