关于 func(const int&) 和 func(const int)

6 c++ c++11

#include <iostream>

class Account {
public:
    static double GetCircumference(const double &dR) { return 2 * dR * 3.1415926; }
    static constexpr double cd = 3.0;
};

// constexpr double Account::cd;

int main()
{
    std::cout << Account::GetCircumference(Account::cd) << std::endl;
}
Run Code Online (Sandbox Code Playgroud)

除非我删除“//”,否则代码是错误的。但如果我只将 (const double &dR) 更改为 (const double dR),也可以。为什么?

dfr*_*fri 4

在 C++11 中,这个类内声明:

static constexpr double cd = 3.0;
Run Code Online (Sandbox Code Playgroud)

不是定义(...直到 C++17;之后constexpr静态数据成员隐式内联)。

这是一个类外定义:

constexpr double Account::cd;
Run Code Online (Sandbox Code Playgroud)

Account::cd如果是odr-used ,则需要一个定义,如果它被传递到:

double GetCircumference(const double &dR);
Run Code Online (Sandbox Code Playgroud)

作为其参考。

[basic.def.odr]/3每个程序都应包含该程序中 odr 使用的每个非内联函数或变量的一个定义;无需诊断。[...]

然而,如果它被传递到

double GetCircumference(const double dR);
Run Code Online (Sandbox Code Playgroud)

它不是 ODR 使用的:

[basic.def.odr]/2表达式可能会被求值,除非它是未求值的操作数(子句 [expr])或其子表达式。名称显示为潜在求值表达式的变量是 odr 使用的([expr.const])和左值到右值转换([conv.lval]的要求的对象) ])立即应用

并且不需要定义。