C ++中聚合的括号初始化的模板参数推导
Template argument deduction for parenthesized initialization of aggregates in C++
在下面的代码中,有一个 A<T>
对象的初始化,模板参数推导使用两种形式,大括号的类型不同:
template<typename T>
struct A{ T x; };
int main() {
static_assert( A{1}.x == 1 ); //#1: ok in GCC and MSVC
static_assert( A(1).x == 1 ); //#2: ok in GCC only
}
GCC 和 MSVC 都接受第一种方式,而第二种方式仅适用于 GCC,而 MSVC 会打印错误:
error C2641: cannot deduce template arguments for 'A'
error C2780: 'A<T> A(void)': expects 0 arguments - 1 provided
error C2784: 'A<T> A(A<T>)': could not deduce template argument for 'A<T>' from 'int'
演示:https://gcc.godbolt.org/z/97G1acqPr
这是 MSVC 中的错误吗?
这些行的格式正确依赖于 aggregate deduction candidate,它提供了一种从聚合初始化列表中推导出 T
的方法。此功能与语法无关,因此其中一个失败而另一个失败已经不一致了。
在 MSVC 的例子中,是 class 模板参数推导和带括号的聚合初始化的组合导致了这个问题(后者单独运行良好)。 MSVC 也fails to compile A a(1);
,格式更明显
这是 MSVC 中的错误。
以下论文均在C++20中引入:
- P0960R3: Allow initializing aggregates from a parenthesized list of values
- P1975R0: Fixing the wording of parenthesized aggregate-initialization
- P2131R0: Fixing CTAD for aggregates
虽然 MSVC 将它们全部列为在其 Microsoft C/C++ language conformance by Visual Studio version 页面中实现的,但似乎它们已经正确地单独实现了它们
// OK (P0960R3, P1975R0)
struct A { int x; };
A a(1);
// OK (P2131R0)
template<typename T>
struct B { T x; };
B b{1};
// rejects-invalid (allowed by the union of the papers)
template<typename T>
struct C { T x; };
C c(1);
MSVC 似乎没有实现论文的联合。但是,我还没有找到公开的错误报告。
在下面的代码中,有一个 A<T>
对象的初始化,模板参数推导使用两种形式,大括号的类型不同:
template<typename T>
struct A{ T x; };
int main() {
static_assert( A{1}.x == 1 ); //#1: ok in GCC and MSVC
static_assert( A(1).x == 1 ); //#2: ok in GCC only
}
GCC 和 MSVC 都接受第一种方式,而第二种方式仅适用于 GCC,而 MSVC 会打印错误:
error C2641: cannot deduce template arguments for 'A'
error C2780: 'A<T> A(void)': expects 0 arguments - 1 provided
error C2784: 'A<T> A(A<T>)': could not deduce template argument for 'A<T>' from 'int'
演示:https://gcc.godbolt.org/z/97G1acqPr
这是 MSVC 中的错误吗?
这些行的格式正确依赖于 aggregate deduction candidate,它提供了一种从聚合初始化列表中推导出 T
的方法。此功能与语法无关,因此其中一个失败而另一个失败已经不一致了。
在 MSVC 的例子中,是 class 模板参数推导和带括号的聚合初始化的组合导致了这个问题(后者单独运行良好)。 MSVC 也fails to compile A a(1);
,格式更明显
这是 MSVC 中的错误。
以下论文均在C++20中引入:
- P0960R3: Allow initializing aggregates from a parenthesized list of values
- P1975R0: Fixing the wording of parenthesized aggregate-initialization
- P2131R0: Fixing CTAD for aggregates
虽然 MSVC 将它们全部列为在其 Microsoft C/C++ language conformance by Visual Studio version 页面中实现的,但似乎它们已经正确地单独实现了它们
// OK (P0960R3, P1975R0)
struct A { int x; };
A a(1);
// OK (P2131R0)
template<typename T>
struct B { T x; };
B b{1};
// rejects-invalid (allowed by the union of the papers)
template<typename T>
struct C { T x; };
C c(1);
MSVC 似乎没有实现论文的联合。但是,我还没有找到公开的错误报告。