2

次のコードは、MSVC ++ 2012 CTP(C + 11をサポート)とIntel C ++XE13.0の両方でコンパイルエラーを発生させます。

template <typename F, typename... Args>
    void apply(F f, std::tuple<Args...>& args) {
       // doesn't do much yet
}

bool f1(char c) {
    return c == 'c';
}

int main(int argc, char* argv[]) {
    auto t = std::make_tuple('c');
    apply(f1, t);
return 0;
}

VS2012エラーは次のとおりです。

error C2243: 'type cast' : 
conversion from 'std::tuple<char,std::_Nil,std::_Nil,std::_Nil,std::_Nil,std::_Nil,std::_Nil,std::_Nil> *'
 to 'std::tuple<std::_Nil,std::_Nil,std::_Nil,std::_Nil,std::_Nil,std::_Nil,std::_Nil,std::_Nil> &' exists,
 but is inaccessible

Intel C ++XE13.0のエラーは次のとおりです。

error : no instance of function template "apply" matches the argument list

私は何が欠けていますか?ここに本当にエラーがありますか、それとも2つの悪いコンパイラがありますか?

更新:両方のコンパイラでstd::tupleの代わりにboost::tupleを使用すると、同じ(または同様の)結果が得られます。

補遺:コメントのすべてのクロスチェックに感謝します。私はこれらのすばらしい企業の両方にバグレポートを送りました。

4

1 に答える 1

4

これは、標準ライブラリの実装におけるVC11のバグである可能性があります。CTPは可変個引数テンプレートをサポートしていますが、私の知る限り、標準ライブラリはそれらを使用するように書き直されておらず、可変個引数テンプレートをシミュレートするためにいくつかの機構を採用しています。これが問題の原因である可能性があります。

于 2013-01-17T20:58:00.727 に答える