为什么这个涉及std :: tuple隐式构造的代码在c ++ 11/14模式下编译?

时间:2017-01-27 14:12:34

标签: c++

根据http://en.cppreference.com/w/cpp/utility/tuple/tuple,{C} 17之前不能隐式构造[].toString()。他们甚至举了一个证明它的例子:

var query = from foo in context.Foos
    join id in IDs on id equals foo.ID
    select foo;

return await query.ToListAsync();

然而,使用gcc 6.2和clang 3.8.1我可以在C ++ 11和C ++ 14模式下干净地编译这段代码:

std::tuple

这里发生了什么?

1 个答案:

答案 0 :(得分:0)

这是LWG 2051,一个缺陷报告。缺陷报告解决了已发布标准中的错误。在这种情况下,可以在C ++ 17中解决该缺陷,因此严格来说,将其追溯应用到C ++ 17之前的标准是不符合标准的。

但是,编译器传统上一直将缺陷报告应用于所有标准模式。对于编译器来说,修复C ++ 11和C ++ 14 IMO中的官方“错误”是合理的。因此,即使将格式错误的代码转换为可接受的代码,甚至改变了SFINAE技巧的可观察到的行为,也会进行此更改。