4

考虑

auto x=foo(), y;

这合法吗?(我想它是并且暗示它与.y的类型相同x。)虽然这个特定示例可能不是很有用,但请考虑

template<typename some_type>
void func(some_type const&x, some_type const&y)
{
  for(auto i=std::begin(x),j=std::begin(y); i!=std::end(x) && j!=std::end(y); ) { 
    ...
  }
}

在这里,iandj都是相同的类型(因为它们都派生自对相同类型对象的相同类型的操作),所以这看起来非常安全和明智,因为它避免声明适当的类型(最好使用decltype(),即再次通过扣除)。

但是,英特尔的编译器(版本 14.0.1)警告我

warning #3373: nonstandard use of "auto" to both deduce the type from an initializer and to announce a trailing return type

那么,我应该如何看待这个警告呢?这种用法有什么问题auto吗?


编辑上面剪断的简单代码确实不会触发警告。但是,看起来非常相似的代码:

struct Neighbour { ... };
typedef std::vector<Neighbour> NeighbourList;
NeighbourList const&A;
NeighbourList const&B;
...
const auto K = std::max(A.size(),B.size());
auto k = 0*K;
for(auto iA=A.begin(),iB=B.begin(); k!=K; ++k,++iA,++iB)
  ...

(for 循环位于类模板的成员方法中)

4

3 回答 3

4
auto x=foo(), y;

不,这是非法的。

我无法重现您的警告,因为两者都i具有j相同的类型。那部分是法律代码。

于 2013-10-30T18:05:32.913 回答
3

第一个例子是非法的:所有的声明器都必须有初始化器,而y没有。

第二个很好:两个声明器都有相同类型的初始化器。

我不知道警告在说什么:这里没有尾随返回类型。GCC 和 Clang 都没有对你的代码给出任何警告;我没有要测试的英特尔编译器。

于 2013-10-30T18:15:23.877 回答
2

根据未来的 C++ 2014

...应作为 decl-specifiers 之一出现在 decl-specifier-seq 中,并且 declspecifier-seq 后面应跟随一个或多个 init-declarators,每个 init-declarators 应具有非空初始化器。

于 2013-10-30T18:13:55.453 回答