C++ 为什么一个定义规则的使用(odr使用)依赖于上下文?

C++ 为什么一个定义规则的使用(odr使用)依赖于上下文?,c++,c++11,constexpr,one-definition-rule,C++,C++11,Constexpr,One Definition Rule,给出以下代码: #include <iostream> struct A { static constexpr float a = 2.0f; }; // non-const reference to make it more explicit - same behaviour template<class T> constexpr inline T square(T& x) { return x * x; } int main() {

给出以下代码:

#include <iostream>

struct A {
    static constexpr float a = 2.0f;
};

// non-const reference to make it more explicit - same behaviour
template<class T> constexpr inline T square(T& x)
{
    return x * x;
}

int main() {
    /*constexpr*/ float val = square(A::a);
    std::cout << val;
}
#包括
结构A{
静态constexpr浮点a=2.0f;
};
//非常量引用使其更显式-相同的行为
模板constexpr内联T方形(T&x)
{
返回x*x;
}
int main(){
/*constexpr*/float val=square(A::A);
标准::cout
为什么odr的使用依赖于上下文

它没有。
square(A::A)
odr使用
A::A
,句点

然而,大多数ODR违规不需要诊断,这也不例外

在这两种情况下,编译器不应该在编译时计算这个函数吗


constexpr
变量的初始值设定项必须在编译时进行求值。(当然,不完全是这样,但编译器必须对其求值到可以确定它是一个有效的常量表达式的程度,在这一点上,它还可以完成整件事。)对于非
constexpr
局部变量,没有这样的保证。

您发布的代码片段在GCC和CLANG中都编译得很好。请不要在标题中使用不常见的首字母缩略词。“一个定义规则使用”到底是什么?@Andrew…这完全没有抓住要点。我知道odr的用途很好。@UmNyobe:“odr使用”在C++标准中是一个艺术术语,它可能是不寻常的,但它是准确的,它是你可以在索引中查找的东西,不像扩展的形式。所以我应该问:“为什么ODR在编译时使用工作?”。例如,指针指向何处?程序没有运行。它指向某些编译器结构吗?为什么在这种情况下它不简单地失败?为什么标准允许这样的结构?@pkubik当然,你可以创建一个问题来问这个问题。让它更精细一点,理想情况下将它附加到一个实际问题上。但是,这个问题,不是那个!