gpt4 book ai didi

c++ - 标准是否要求 std::tuple_size 对 SFINAE 友好?

转载 作者:IT老高 更新时间:2023-10-28 22:40:43 26 4
gpt4 key购买 nike

编辑附加:问题标题是“Visual Studio 编译器或 Clang 是否有不正确的行为”- 但已更改。

所以我在这里补充一下,clang 和 gcc 按照我的预期编译它,但 VS 没有。

我有以下代码:

template<typename S, typename T, std::size_t... I>
void
print_tuple_like(S& s, const T& t, std::index_sequence<I...>)
{
void* unused[] = { &(s << std::get<I>(t))... };
}

template<typename S, typename T,
std::size_t N = std::tuple_size<decltype(T::children)>::value>
S& operator<<(S& s, const T& t)
{
print_tuple_like(s, t.children, std::make_index_sequence<N>{});
return s;
}

我得到一个编译器错误:

1>c:\program files (x86)\microsoft visual studio 14.0\vc\include\utility(313): error C2338: The C++ Standard doesn't define tuple_size for this type.
1> c:\users\jonas\documents\visual studio 2015\projects\consoleapplication7\consoleapplication7\consoleapplication7.cpp(36): note: see reference to class template instantiation 'std::tuple_size<unknown-type>' being compiled
1> c:\users\jonas\documents\visual studio 2015\projects\consoleapplication7\consoleapplication7\consoleapplication7.cpp(43): note: see reference to function template instantiation 'void print_tuple_like<S,std::tuple<Signature::A,Signature::B>,0,1>(S &,const T &,std::integer_sequence<_Ty,0,1>)' being compiled
1> with
1> [
1> S=std::ostream,
1> T=std::tuple<Signature::A,Signature::B>,
1> _Ty=size_t
1> ]
1> c:\users\jonas\documents\visual studio 2015\projects\consoleapplication7\consoleapplication7\consoleapplication7.cpp(50): note: see reference to function template instantiation 'S &operator <<<std::ostream,Signature,2>(S &,const T &)' being compiled
1> with
1> [
1> S=std::ostream,
1> T=Signature
1> ]

那是因为 Visual Studio 中的以下代码:

// TEMPLATE STRUCT tuple_size 
template<class _Tuple>
struct tuple_size { // size of non-tuple
static_assert(_Always_false<_Tuple>::value, "The C++ Standard doesn't define tuple_size for this type.");
};

将替换失败变成硬失败——使 SFINAE SFIAE

如果我删除

static_assert(_Always_false<_Tuple>::value, "The C++ Standard doesn't define tuple_size for this type.");

它有效。

代码是否符合 c++ 标准规则?还是微软错了?

最佳答案

N4140 20.4.1 将 tuple_size 的非专用版本描述为:

template <class T> class tuple_size; // undefined

通过提供定义,MSVC 库违反了标准。

但是,您应该意识到,您的问题不在于所涉及的编译器,而在于标准库的实现。

关于c++ - 标准是否要求 std::tuple_size 对 SFINAE 友好?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31035563/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com