static_assert не распознает параметр шаблона const char* как constexpr: ошибка g++?

Рассмотрим приведенные ниже определения.

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 имеет некоторые недостаткипри обработке адресов в качестве параметров шаблона. Это один и тот же баг?

8
задан Lorenzo Pistone 1 May 2012 в 23:39
поделиться