我很乐意像
一样迭代for( auto n = object.get_size(), i = decltype( n )( 0 );
i < n;
++i
) { ... }
自动获取所有类型的权利。使用g ++ 4.7.1没有问题,但是版本4.7.0我得到了错误。由于4.7.1是新的,我想知道哪个版本实现了bug,哪个版本是标准。此外,4.7.0(以及带有std = c ++ 0x的4.6.3)仅在与模板结合使用时才会产生抱怨,并在不同的用法中生成不同的错误。请参阅以下代码:
/* test.cxx */
#ifdef V1
#ifdef GENERIC
template< class T >
void do_some( T obj ) {
for( auto n = obj, i = decltype( n )( 0 );
i < n; ++i ) { }
}
#endif
#ifdef SPECIFIC
void do_some( int obj ) {
for( auto n = obj, i = decltype( n )( 0 );
i < n; ++i ) { }
}
#endif
#endif
#ifdef V2
template< class T >
class foo {
T member;
public:
foo( T stuff ) : member( stuff ) {}
T get_member() { return member; }
};
#ifdef GENERIC
template< class T >
void do_some( T obj ) {
for( auto n = obj.get_member(), i = decltype( n )( 0 );
i < n; ++i ) { }
}
#endif
#ifdef SPECIFIC
void do_some( foo< int > obj ) {
for( auto n = obj.get_member(), i = decltype( n )( 0 );
i < n; ++i ) { }
}
#endif
#endif
int main() {
#ifdef V1
int foo_inst = 10;
#endif
#ifdef V2
foo< int > foo_inst( 10 );
#endif
do_some( foo_inst );
return 0;
}
和g ++版本4.7.0的输出
$ g++-4.7 -DV1 -DGENERIC -std=c++11 test.cxx
test.cxx: In function ‘void do_some(T)’:
test.cxx:7:42: error: inconsistent deduction for ‘auto’: ‘T’ and then ‘decltype (n)’
$ g++-4.7 -DV1 -DSPECIFIC -std=c++11 test.cxx
/* compiles fine */
$ g++-4.7 -DV2 -DGENERIC -std=c++11 test.cxx
test.cxx: In function ‘void do_some(T)’:
test.cxx:35:55: error: variable ‘auto n’ with ‘auto’ type used in its own initializer
$ g++-4.7 -DV2 -DSPECIFIC -std=c++11 test.cxx
/* compiles fine */
答案 0 :(得分:1)
没有解释,只是测试: gcc早于4.7.1,我有同样的错误,4.7.1,4.8(主干)和clang-3.2(主干)没有错误