4

私は喜んで次のように繰り返してきました

for( auto n = object.get_size(), i = decltype( n )( 0 ); 
     i < n; 
     ++i 
) { ... } 

すべてのタイプを自動的に正しく取得します。g++ 4.7.1 では問題ありませんでしたが、バージョン 4.7.0 ではエラーが発生しました。4.7.1 はかなり新しいので、どのバージョンがバグを実装しているか、どのバージョンが標準であるかを知りたいです。また、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 */
4

1 に答える 1

1

説明はありません、ただテストしてください: 4.7.1 より古い gcc であなたと同じエラーがあり、4.7.1、4.8 (トランク)、clang-3.2 (トランク) からのエラーはありません

于 2012-08-20T15:56:18.330 に答える