考虑
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); ) {
...
}
}
这里,i
和j
都属于同一类型(因为两者都来自同一类型对象的相同类型的操作),所以这看起来非常安全和合理,因为它避免声明适当的类型(最好使用decltype()
,即通过再次扣除)。
然而,intel的编译器(版本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循环存在于类模板的成员方法中)
答案 0 :(得分:4)
auto x=foo(), y;
不,这是非法的。
我无法重现您的警告,因为i
和j
都有相同的类型。那部分是合法代码。
答案 1 :(得分:3)
第一个例子是非法的:所有声明者都必须有初始化者,而y
则没有。
第二种情况很好:两个声明者都有相同类型的初始化者。
我不知道警告的内容是什么:这里没有尾随的返回类型。 GCC和Clang都没有对您的代码发出任何警告;我没有使用英特尔编译器进行测试。
答案 2 :(得分:2)
根据未来的C ++ 2014
...将作为decl-specifier-seq中的decl-specifiers之一出现 并且declspecifier-seq后面应跟一个或多个 init-declarators,每个都应该有一个非空的初始化器。