访问静态constexpr float成员时的未定义引用

Ano*_*ity 8 c++ clang one-definition-rule constexpr

此代码有效:

struct Blob {
    static constexpr int a = 10;
};

int main() {
    Blob b;
    auto c = b.a;
}
Run Code Online (Sandbox Code Playgroud)

但是,如果我改为int,float我会收到一个错误:

struct Blob {
    static constexpr float a = 10.0f;
};
Run Code Online (Sandbox Code Playgroud)

/tmp/main-272d80.o:在函数main': main.cpp:(.text+0xe): undefined reference toBlob :: a'中

为什么我不能constexpr float以这种方式使用?

编译器:Ubuntu clang版本3.5.0-4ubuntu2(标签/ RELEASE_350/final)

在gcc版本4.9.1(Ubuntu 4.9.1-16ubuntu6)上测试并且没有错误.

编辑:

如果我使用-O1,-O2,-O3或-Os但它会在-O0失败时进行编译

Col*_*mbo 6

C++ 11读取

名称显示为潜在评估表达式的变量是 odr-used, 除非它是满足出现在常量表达式(5.19)中的要求的对象,并且立即应用左值到右值转换(4.1).

显然,立即应用ltr转换,并且constexpr浮点类型的变量可以按照[expr.const] /(2.7.1)出现在常量表达式中:

条件表达式是一个核心常量表达式除非它涉及以下作为一个潜在的评价子表达式中的一个[..]

  • 除非适用,否则左值到右值的转换(4.1)
    • 一个文字类型的glvalue,它引用一个非易失性对象constexpr,或者引用这样一个对象的子对象,或者

似乎是一个Clang bug.