【发布时间】:2013-10-31 12:50:46
【问题描述】:
2011 C++ 标准引入了新的关键字auto,可以用来定义变量而不是类型,即
auto p=make_pair(1,2.5); // pair<int,double>
auto i=std::begin(c), end=std::end(c); // decltype(std::begin(c))
在第二行中,i 和end 属于同一类型,称为auto。标准不允许
auto i=std::begin(container), e=std::end(container), x=*i;
当x 属于不同类型时。 我的问题:为什么标准不允许最后一行?可以通过将auto 解释为不代表某个要推导的类型,而是指示声明auto 的any 变量的类型应从其分配的值推导出来允许。 C++11 标准是否有充分的理由不遵循这种方法?
这其实有一个用例,即在for循环的初始化语句中:
for(auto i=std::begin(c), end=std::end(c), x=*i; i!=end; ++i, x+=*i)
{ ... }
当变量i、end 和x 的范围被限制为for 循环时。 AFAIK,除非这些变量具有通用类型,否则这在 C++ 中无法实现。 这是正确的吗?(将所有类型放入 struct 的丑陋技巧除外)
在一些可变参数模板应用程序中也可能存在用例。
【问题讨论】:
-
几乎所有形式为“为什么标准说废话”的问题都有以下答案之一:1)向后兼容 C,2)他们没有时间做其他事情, 3) [在此处插入未经证实的意见]
-
@JohnDibling 我不同意。通常有很好的理由(除了向后兼容性,这似乎不适用于这里)。我想知道这里是否有充分的理由。
-
约翰说得对。几乎所有这样的问题都以这种形式的答案结束。他并不是说不存在充分的理由。只是它通常不为人所知或记录在案。我不知道,你能得到标准委员会的会议记录吗?看起来你可以:open-std.org/jtc1/sc22/wg21/docs/papers我建议你搜索这些。
-
@DavidHeffernan 很好。但是,该提案不允许在一个
auto语句中使用不同的类型。它只允许对所有以下类型使用第一种类型推导,即auto x=3,y;当y自动为int时。该论点似乎是一致性:任何形式为type x[=initialier], y[=initialier], ...的变量声明都应始终只定义相同类型的变量,即使是type=auto。