我想從一個簡化的例子開始:
const bool Foo() { return false; }
bool Bar() { return false; }
int main() {
std::cout << std::is_same<const bool, std::invoke_result_t<decltype(Foo)>>::value << std::endl;
std::cout << std::is_same<bool, std::invoke_result_t<decltype(Foo)>>::value << std::endl;
std::cout << std::is_same<bool, std::invoke_result_t<decltype(Bar)>>::value << std::endl;
}
我預料1 0 1到了,但結果是0 1 1。
這是預期的嗎?如果是這樣,這是否因編譯器而異,還是由 C 標準決定?
我的理解是我們仍然可以回傳const T,但它并沒有太大的區別/沒有意義,因為C 11。因此,我認為回傳型別仍然是const T( const boolhere),編譯器會警告我,但似乎并非如此。我想了解發生了什么。
uj5u.com熱心網友回復:
std::invoke_result沒有給你宣告的函式回傳型別。它為您提供了decltype一個INVOKE運算式,即在這種情況下的函式呼叫運算式,將具有給定的引數型別。這在標準中基本上與此完全一樣(使用更多技術性措辭)。
回傳按值(而不是按參考)的函式的函式呼叫運算式是純右值運算式。如果prvalue 運算式是非型別別,它的const-qualifier 總是被剝離。const語言中的 a和const非非類純右值之間沒有區別。
所以這就是為什么你沒有得到一個const. const在回傳非型別別按值的函式上本質上是沒有意義的,編譯器會在啟用警告的情況下警告您。這里唯一的作用const是改變函式的型別。對函式的實際呼叫沒有區別。
即使const在按值回傳的型別別上也大多沒用。只有少數特殊情況有意義(例如,不允許直接在呼叫運算式上呼叫修改成員函式),但也會帶來重大問題(即可能禁用移動語意)。這在早期的 C 中更為常見,但從 C 11 開始,它也很少使用。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/532663.html
