C++中聚合带括号初始化的模板参数演绎

Template argument deduction for parenthesized initialization of aggregates in C++(C++中聚合带括号初始化的模板参数演绎)

本文介绍了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中的错误吗?

推荐答案

这是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似乎错过了实施报纸联盟的机会。但是,我找不到打开的错误报告。

这篇关于C++中聚合带括号初始化的模板参数演绎的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持编程学习网!

本文标题为:C++中聚合带括号初始化的模板参数演绎

基础教程推荐