以下代码给出了 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 时,结果相同(或相似)。
附录:感谢评论中的所有交叉检查。我已经向这两家优秀的公司发送了错误报告。