使用派生自 std::tuple 的元素在 std::tuple 上调用 std::get - 格式错误?
Calling `std::get` on `std::tuple` with elements deriving from `std::tuple` - ill-formed?
struct Y { };
struct X : std::tuple<Y> { };
int main()
{
std::get<0>(std::make_tuple(X{}));
}
当使用 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); }
~~~~~~~~~~~~~~~~~~~~~~^~~~~
似乎 libstdc++ 的 std::tuple
的基于继承的实现在调用 std::get
时从 std::tuple
派生的元组元素导致歧义.我倾向于认为这是 libstdc++ 中的一个实现缺陷 - 是这样吗?还是标准中有什么东西会使代码片段格式错误?
如T.C. in the comments, this is caused by the known bug #71096所述。
struct Y { };
struct X : std::tuple<Y> { };
int main()
{
std::get<0>(std::make_tuple(X{}));
}
当使用 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); }
~~~~~~~~~~~~~~~~~~~~~~^~~~~
似乎 libstdc++ 的 std::tuple
的基于继承的实现在调用 std::get
时从 std::tuple
派生的元组元素导致歧义.我倾向于认为这是 libstdc++ 中的一个实现缺陷 - 是这样吗?还是标准中有什么东西会使代码片段格式错误?
如T.C. in the comments, this is caused by the known bug #71096所述。