#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;
}
除非我洗掉“//”,否則代碼是錯誤的。但是,如果我只將 (const double &dR) 更改為 (const double dR),它也可以。為什么?
uj5u.com熱心網友回復:
在 C 11 中,這個類內宣告:
static constexpr double cd = 3.0;
不是定義(...直到 C 17;之后constexpr靜態資料成員被隱式行內)。
這是一個類外的定義:
constexpr double Account::cd;
如果Account::cd是odr-used,則需要定義,如果它被傳遞給:
double GetCircumference(const double &dR);
作為參考。
[basic.def.odr]/3每個程式都應包含該程式中 odr 使用的每個非行內函式或變數的準確定義;無需診斷。[...]
但是,如果它傳遞給
double GetCircumference(const double dR);
它不是 odr 使用的:
[basic.def.odr]/2一個運算式可能被求值,除非它是一個未求值的運算元(子句 [expr])或其子運算式。名稱顯示為潛在求值運算式的變數是 odr-used除非它是滿足出現在常量運算式([expr.const])和左值到右值轉換([conv.lval])立即應用。
并且不需要定義。
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/421520.html
標籤:
