【发布时间】:2014-07-27 13:23:28
【问题描述】:
为什么 decltype 在需要类型时不能隐式添加到表达式中?
template <class X, class Y, class Z>
auto foo(X x, Y y, Z z){
std::vector<decltype(x+y*z)> values; // valid in c++11/c++14
//std::vector<x+y*z> values; // invalid
values.push_back(x+y*z);
return values; // type deduced from expression - OK
}
在 c++14 中,编译器将能够根据返回表达式推断函数返回类型。为什么这不能扩展到任何“表达式->类型”转换?
同样适用于declval,我为什么要写:
std::vector<decltype(declval<X>() + declval<Y>() * declval<Z>())> values;
代替:
std::vector<X+Y*Z> values;
【问题讨论】:
-
我很确定它可能会引入模棱两可的解析......
-
... 几乎没有什么好处。 C++ 中已经有一大堆隐含的东西了。显式 = 好,隐式 = 坏。
-
@jrok:这太笼统了。或者你想在汇编器中编码?
-
@Deduplicator 应用常识 :) 事实上,我不喜欢过度概括自己。
-
@Deduplicator:您将显式误认为是低级。回顾过去的 C++,Rust 在 显式与隐式 尺度上采取了相当极端的观点(例如,即使在非有损上下文中显式整数转换),但它也包含了函数式编程概念。