我正在學習 C 中的 SFINAE。所以在閱讀了它之后,我正在嘗試不同的例子來更好地理解這個概念。下面我給出了 2 個片段,其中 1 個我可以理解,但我noexcept在宣告中使用的第二個片段我無法理解。
示例1:我能夠理解這一點。
#include <iostream>
template<typename T>
decltype(func(T())) timer(T a)
{
std::cout<<"template timer called"<<std::endl;
return func(T());
}
void timer(...)
{
std::cout<<"ordinary timer called"<<std::endl;
}
int main()
{
timer(5);
return 0;
}
上述程式的輸出(如預期)是:
ordinary timer called
我可以理解,由于 SFINAE 扣除將導致失敗,因此timer將呼叫普通。
示例 2:為什么我們在這個示例中會出錯。
#include <iostream>
template<typename T>
void timer(T a) noexcept(func(T()))
{
std::cout<<"template timer called"<<std::endl;
}
void timer(...)
{
std::cout<<"ordinary timer called"<<std::endl;
}
int main()
{
timer(5);
return 0;
}
第二個示例導致一個錯誤,即func未宣告。我的問題是為什么就像這里的示例1一樣,由于扣除失敗,普通人timer沒有被選中?
我希望這里也timer應該呼叫普通的,但事實并非如此。有人可以解釋其背后的原因。
uj5u.com熱心網友回復:
問題是例外規范不參與模板引數推導(TAD)。這將在下面更詳細地解釋。

轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/446217.html
