#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),也可以。为什么?
在 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]的要求的对象) ])立即应用。
并且不需要定义。
| 归档时间: |
|
| 查看次数: |
72 次 |
| 最近记录: |