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++中聚合带括号初始化的模板参数演绎
基础教程推荐
猜你喜欢
- 运算符重载的基本规则和习语是什么? 2022-10-31
- C++,'if' 表达式中的变量声明 2021-01-01
- 调用std::Package_TASK::Get_Future()时可能出现争用情况 2022-12-17
- 设计字符串本地化的最佳方法 2022-01-01
- 如何在 C++ 中处理或避免堆栈溢出 2022-01-01
- 您如何将 CreateThread 用于属于类成员的函数? 2021-01-01
- 什么是T&&(双与号)在 C++11 中是什么意思? 2022-11-04
- C++ 标准:取消引用 NULL 指针以获取引用? 2021-01-01
- C++ 程序在执行 std::string 分配时总是崩溃 2022-01-01
- 如何定义双括号/双迭代器运算符,类似于向量的向量? 2022-01-01