2

以下代码给出了 MSVC++ 2012 CTP(支持 C+11)和 Intel C++ XE 13.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++ XE 13.0 上的错误是:

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

我错过了什么?这里真的有错误,还是我只有两个错误的编译器?

更新:当我在两个编译器上使用 boost::tuple 而不是 std::tuple 时,结果相同(或相似)。

附录:感谢评论中的所有交叉检查。我已经向这两家优秀的公司发送了错误报告。

4

1 回答 1

4

这可能是标准库实现中的 VC11 错误。尽管 CTP 支持可变参数模板,但据我所知,标准库并未重写以使用它们,而是采用了一些机制来模拟可变参数模板。这很可能是您问题的根源。

于 2013-01-17T20:58:00.727 回答