當前我正在閱讀Scott Meyers的Effective Modern C++(項目15 - 儘可能使用constexpr。)。作者說:當編譯時不知道參數時,不調用`constexpr`構造函數
當constexpr函數被調用與被 不是在編譯期間已知的一個或多個值,它就像一個正常的功能, 計算其在運行時的結果。這意味着您不需要兩個函數來執行相同的操作,一個用於編譯時間 常量,另一個用於所有其他值。 constexpr函數全部都是 。
我嘗試了下面的代碼片段在http://coliru.stacked-crooked.com/
#include <iostream>
class Point
{
public:
constexpr Point(double a, double b) noexcept
: _a(a), _b(b)
{
}
void print() const noexcept
{
std::cout << "a -> " << _a << "\tb -> " << _b << std::endl;
}
private:
double _a;
double _b;
};
double get_a() noexcept
{
return 5.5;
}
double get_b() noexcept
{
return 5.6;
}
int main()
{
constexpr Point p1(2.3, 4.4);
p1.print();
int a = get_a();
int b = get_b();
constexpr Point p2(a, b);
p2.print();
return 0;
}
在創建p1
對象一切如預期的情況:參數被稱爲編譯時和成員被正確初始化。在創建p2
對象的情況下,儘管在編譯時我們不知道a
和b
變量的值,但它應該在我的理解中起作用,因爲構造函數應該充當正常函數。但我發現了以下錯誤信息:
main.cpp: In function 'int main()'
main.cpp:38:28: error: the value of 'a' is not usable in a constant expression
constexpr Point p2(a, b);
^
main.cpp:36:9: note: 'int a' is not const
int a = get_a();
^
main.cpp:38:28: error: the value of 'b' is not usable in a constant expression
constexpr Point p2(a, b);
^
main.cpp:37:9: note: 'int b' is not const
int b = get_b();
Coliru
使用GCC編譯器。 所以,我不明白是什麼問題。也許我錯過了什麼......
你不應該申報'p2'爲'constexpr',因爲它不能。所以只要'點p2(a,b);''''' – songyuanyao
爲什麼?在'p1'中,成員初始化編譯時間,因爲我們有編譯時間的已知參數:2.3,4.4。在'p2'情況下,我們不知道'a'和'b'編譯時間的值,並不意味着成員應該已經初始化了運行時? (當一個constexpr函數被調用時,有一個或多個在編譯期間未知的值,它就像一個普通函數,在運行時計算其結果。) –
您的報價僅指函數。如果你聲明一個對象或表達式'constexpr',你需要在編譯時進行評估,而'p2'不能像宋玉瑤指出的那樣。 – patatahooligan