【发布时间】:2021-12-25 21:32:00
【问题描述】:
在下面的代码中,有一个 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 都接受第一种方式,而第二种方式仅在 MSVC 打印错误时适用于 GCC:
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 中的错误吗?
【问题讨论】:
-
不是 100% 肯定,但似乎 MSVC 在这里错了。如果您添加构造函数,两者都可以工作:
constexpr A(T v= T{}) : x(v){}
标签: c++ language-lawyer c++20 aggregate-initialization