【发布时间】:2020-05-12 10:55:13
【问题描述】:
为什么这会“按预期”工作? 我的理解是这不应该起作用:
template <class T, class U>
auto x(T a, U b) -> decltype(a<b ? a:b) {
return a > b ? a : b;
}
int main() {
cout << x<long, double>(1, 2.01) << endl;
cout << x<long, double>(5, 2.01) << endl;
}
我尝试了其他一些组合,例如:
template <class T, class U>
auto x(T a, U b) -> decltype(a<b ? a:a) {
return a > b ? a : b;
}
这样它不会编译错误实际上第二个组合失败了
compile time error: Error C2440 'return': cannot convert from 'U' to 'T &'
这是预期的。我的理解是第一个函数也应该失败并出现同样的错误,但它工作正常。
【问题讨论】:
-
您的期望是什么,实际行为是什么,以及它在哪些方面未能满足您的期望?我不清楚你到底在问什么。
-
与任何表达式一样,表达式
a<b ? a:b具有某种类型,派生自a和b的类型并且独立于它们的值。您似乎期望表达式具有不同的类型,具体取决于在运行时是a<b还是!(a<b)。这不是 C++ 的工作方式——所有类型都是在编译时确定的。 -
请注意,如果使用两个相同类型的参数调用该函数,则该函数具有未定义的行为。不要使用它。如果您删除尾随的
decltype(...)返回类型或在其周围添加std::decay_t会很好。 -
实际上第二个组合失败并出现编译时错误:严重性代码描述项目文件行抑制状态错误 C2440 'return': cannot convert from 'U' to 'T &'
-
我的期望是看到打印出各种类型的最大值,尤其是 double 和 long。但是如果你在 decltype 中看到 min 被写入,而它仍然计算 max。
标签: c++ c++11 templates decltype trailing-return-type