c++ - 使用派生自 `std::get` 的元素在 `std::tuple` 上调用 `std::tuple` - 格式错误?

标签 c++ c++11 language-lawyer libstdc++ stdtuple

struct Y { };
struct X : std::tuple<Y> { };

int main()
{
    std::get<0>(std::make_tuple(X{}));
}

on wandbox


当使用 libc++ 时,上面的代码可以通过 clang++ 编译并按预期工作。

当使用 libstdc++ 时,上述代码无法同时使用 clang++g++ 进行编译,并出现以下错误:

include/c++/7.0.1/tuple:1302:36: 
error: no matching function for call to ‘__get_helper<0>(std::tuple<X>&)’
    { return std::__get_helper<__i>(__t); }
            ~~~~~~~~~~~~~~~~~~~~~~^~~~~

include/c++/7.0.1/tuple:1290:5: 
note: candidate: template<long unsigned int __i, class _Head, class ... _Tail> 
                constexpr _Head& std::__get_helper(std::_Tuple_impl<_Idx, _Head, _Tail ...>&)
    __get_helper(_Tuple_impl<__i, _Head, _Tail...>& __t) noexcept
    ^~~~~~~~~~~~

include/c++/7.0.1/tuple:1290:5: 
note:   template argument deduction/substitution failed:
include/c++/7.0.1/tuple:1302:36: 
note:   ‘std::_Tuple_impl<0, _Head, _Tail ...>’ is an ambiguous base class of ‘std::tuple<X>’
    { return std::__get_helper<__i>(__t); }
            ~~~~~~~~~~~~~~~~~~~~~~^~~~~

include/c++/7.0.1/tuple:1295:5: 
note: candidate: template<long unsigned int __i, class _Head, class ... _Tail> 
                constexpr const _Head& std::__get_helper(const std::_Tuple_impl<_Idx, _Head, _Tail ...>&)
    __get_helper(const _Tuple_impl<__i, _Head, _Tail...>& __t) noexcept
    ^~~~~~~~~~~~

include/c++/7.0.1/tuple:1295:5: 
note:   template argument deduction/substitution failed:
include/c++/7.0.1/tuple:1302:36: 
note:   ‘const std::_Tuple_impl<0, _Head, _Tail ...>’ is an ambiguous base class of ‘std::tuple<X>’
    { return std::__get_helper<__i>(__t); }
            ~~~~~~~~~~~~~~~~~~~~~~^~~~~

当元组元素派生自 std::tuple 时,libstdc++std::tuple 的基于继承的实现似乎会导致歧义在调用 std::get 时。我倾向于认为这是 libstdc++ 中的一个实现缺陷 - 是这样吗?还是标准中有什么东西会使代码片段格式错误?

最佳答案

T.C. 所述在评论中,这是由 known bug #71096 引起的.

关于c++ - 使用派生自 `std::get` 的元素在 `std::tuple` 上调用 `std::tuple` - 格式错误?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41990514/

相关文章:

c++ - 标记为 bitset 和 uint64_t 的并集

Java 内部类和继承 : Is there a duplicate outer this reference?

c++ - 链中的最后一个任务应该返回什么 - C++ Rest sdk?

c++ - C++ 中的多层命名空间规范

c++ - CMake + freeglut3 : cannot find usbhid. h

c - 这是 main() 的有效定义吗

c++ - 将整数转换为指针总是定义良好吗?

c++ - 程序的调用堆栈限制在所有计算机上是否一致?

c++11 - 当我 %1000 64 位 mersennetwister 引擎生成的数字时,为什么我得到的数字大于 1000?

c++ - 为什么 SFINAE 不能与 std::enable_if_t 一起使用?