【发布时间】:2021-12-29 17:04:31
【问题描述】:
#include <iostream>
struct U
{
template<typename T>
operator T();
};
template<unsigned I>
struct X : X<I - 1> {};
template<>
struct X<0> {};
template<typename T>
constexpr auto f(X<4>) -> decltype(T(U{}, U{}, U{}, U{}), 0u) { return 4u; }
template<typename T>
constexpr auto f(X<3>) -> decltype(T(U{}, U{}, U{}), 0u) { return 3u; }
template<typename T>
constexpr auto f(X<2>) -> decltype(T(U{}, U{}), 0u) { return 2u; }
template<typename T>
constexpr auto f(X<1>) -> decltype(T(U{}), 0u) { return 1u; }
template<typename T>
constexpr auto f(X<0>) -> decltype(T{}, 0u) { return 0u; }
struct A
{
void* a;
int b;
double c;
};
int main() { std::cout << f<A>(X<4>{}) << std::endl; }
gcc 和clang 都接受上面的代码。然而,gcc 给出了预期的输出3;除了 clang 给出的意外输出 1。
见:https://godbolt.org/z/YKnxWah1a
相关问答:Why does Clang 12 refuse to initialize aggregates in the C++20 way?
在这种情况下哪个是正确的?
【问题讨论】:
-
不知道在 c++20 中哪个是正确的,但是 gcc -std=c++17 打印 1。
-
虽然 Clang 不支持通过
()进行聚合初始化可以解释为什么它输出 1,但我不认为它解释了 GCC 是否可以输出 3。也就是说,标准说明 3 过载被认为比 1 过载更好? -
对于
X<4>,X<3>是比X<1>更直接的基类。我想是这样。 @NicolBolas
标签: c++ gcc clang c++20 aggregate-initialization