首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

C++17类模板参数推导在初始值设定项列表中不起作用,为什么?

C++17中引入了类模板参数推导的特性,它允许在实例化模板时自动推导模板参数。然而,在初始值设定项列表中,类模板参数推导不起作用的原因是因为初始值设定项列表在编译时被求值,而类模板参数推导是在实例化阶段进行的。

初始值设定项列表是用于初始化类模板的成员变量的,它在编译时被求值,而不是在实例化阶段。由于类模板参数推导是在实例化阶段进行的,因此在初始值设定项列表中无法使用类模板参数推导。

为了解决这个问题,可以使用构造函数的参数列表来进行参数推导。通过在构造函数中使用参数推导,可以在实例化阶段推导出模板参数,并在构造函数中使用这些参数进行初始化。

总结起来,C++17类模板参数推导在初始值设定项列表中不起作用的原因是因为初始值设定项列表在编译时被求值,而类模板参数推导是在实例化阶段进行的。为了解决这个问题,可以使用构造函数的参数列表来进行参数推导。

腾讯云相关产品和产品介绍链接地址:

  • 腾讯云C++ SDK:https://cloud.tencent.com/document/product/876
  • 腾讯云云服务器(CVM):https://cloud.tencent.com/product/cvm
  • 腾讯云云数据库MySQL版:https://cloud.tencent.com/product/cdb_mysql
  • 腾讯云云原生容器服务:https://cloud.tencent.com/product/tke
  • 腾讯云人工智能平台:https://cloud.tencent.com/product/ai
  • 腾讯云物联网平台:https://cloud.tencent.com/product/iotexplorer
  • 腾讯云移动开发平台:https://cloud.tencent.com/product/mwp
  • 腾讯云对象存储(COS):https://cloud.tencent.com/product/cos
  • 腾讯云区块链服务:https://cloud.tencent.com/product/bcs
  • 腾讯云元宇宙服务:https://cloud.tencent.com/product/tencent-metaverse
页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

深入解析C++的auto自动类型推导

于是C++标准委员会在C++11标准改变了auto关键字的语义,使它变成一个类型占位符,允许定义变量时不必明确写出确切的类型,让编译器在编译期间根据初始值自动推导出它的类型。...非类型模板形参的占位符(C++17C++17标准再次拓展了auto的功能,使得能够作为非类型模板形参的占位符,如下的例子: template void func() { std...结构化绑定功能(C++17C++17标准auto还支持了结构化绑定的功能,这个功能有点类似tuple类型的tie函数,它可以分解结构化类型的数据,把多个变量绑定到结构化对象内部的对象上,没有支持这个功能之前...内初始化成员时不能使用auto C++11标准已经支持了内初始化数据成员,也就是说定义时,可以直接在内声明数据成员的地方直接写上它们的初始值,但是在这个情况下不能使用auto来声明非静态数据成员...虽然不能支持声明非静态数据成员,但却可以支持声明静态数据成员,C++17标准之前,使用auto声明静态数据成员需要加上const修饰词,这就给使用上造成了不便,因此C++17标准取消了这个限制:

14520

C++17, 语言核心层变化的更多细节

, C++17, auto 的这种自动类型推导能力又进一步增强了,借助auto,函数模板和(模板的)构造函数的模板参数可以根据其参数自动进行类型推导(细节介绍),非类型模板参数的类型也可以从参数自动推导出来....下面我就来介绍一下非类型模板参数的自动类型推导....通过将模板参数声明为 auto, 编译器便可以自动推导非类型模板参数(第1行代码的 N)的类型了,你甚至可以像示例代码那样(第7和第8行)偏特化该模板(示例代码为int类型进行了偏特化).第13行代码的模板会依据原始模板...即便在可变参数模板,非类型模板参数也可以进行自动类型推导. template class VariadicTemplate { ... }; template <auto...Nested namespaces C++17,你可以非常简便的定义嵌套的命名空间.

70810

C++17常用新特性

2 C++17新特性 2.1 折叠表达式 从C++17开始,可以使用二元操作符对形参包参数进行计算,这一特性主要针对可变参数模板进行提升,可以分为左折叠和右折叠。支持的二元操作符多达32个。...对模板进行实例化时,不需要指定模板参数,编译器会根据传入的实参进行类型推导。...模板参数中使用auto作为关键字时,模板实例化传入非类型值,auto可以推导参数类型。...不过这一特性C++20已经被支持进来。C++17支持的类型包括:左值引用,整数,指针类型,成员指针类型,枚举。...i = 42 3 总结 对于C++17新增特性很多编译器已经都能够进行支持,当然C++17版本规划的内容也不止上面说的这些,如果大家有需要补充或者对上述内容进行指正的欢迎大家留言。

2.2K20

C++auto关键字的用法详解

return 0; } 所以auto无疑是十分不错的选择 5、autoC++14和C++17的更新 C++的auto关键字最初C++11引入,主要用于自动类型推导,使编程更简洁。...示例: auto genericAdd = [](auto x, auto y) { return x + y; }; C++17对auto的更新 成员初始化: C++17允许中使用auto...关键字来声明成员变量,并通过构造函数列表初始化语法或默认成员初始化器来推导类型。...示例: struct Example { auto value = 42; // 自动推导为int }; 模板参数推导: C++17引入了模板参数推导,这意味着使用模板时不再总是需要显式指定模板参数...对于函数模板,如果使用auto来指定参数类型,编译器可以根据传递的实参推导模板参数类型。

17710

全面盘点17个C++17的高级特性

If Initializers C++17的If初始化器是一特性,它允许if语句中直接初始化变量。这种初始化方式在一定程度上可以提高代码的可读性和简洁性。...模板参数推导(CTAD) CTAD 让编译器从参数自动推导模板参数。这使得不必显式指定模板参数的情况下更容易地使用模板。...8.模板模板参数 例如:C++17,语法 template<template<class......内联变量 C++17允许的定义内部定义变量为内联的,这可以帮助减小二进制大小,可能通过防止变量多个转换单元的重复副本来提高性能。...嵌套命名空间 C++17通过折叠表达式增强了变参模板,使得处理参数包时的代码更为简洁和表达明了。

90810

CC++开发基础——模板

myArray; 二,模板的成员函数 模板模板定义的成员函数,与普通的一样,成员函数可以看作是所有模板实例的内联函数。...但是模板体的外部定义的成员函数,语法与普通的不同,需要将成员函数定义为函数模板。 由于成员函数的函数模板与它们的模板绑定在一起,所以函数模板使用的参数列表必须与模板参数列表完全相同。...{10}; //定义了一个对象,会创建模板的实例,同时还会生成构造函数的函数模板实例 三,非类型模板参数 非类型参数是指模板定义,带有指定类型的参数。...非类型模板参数还可以定义的时候给一个初始值,例如: template class ClassName { //code }; 非类型参数支持的数据类型...从C++17开始,也可以指定auto,auto& 和 auto* 等作为非类型参数,编译器会自动推导出类型。

18650

【ModernCpp】新特性之CTAD

second} {} T result()const{return first + second;} private: T first_; T second_; }; 这个例子很简单,声明一个模板...c++17之前,如果我们要使用Add,往往必须像如下这么做: int main(){ Add ti(1,2); return 0; } 即在实例化对象ot的时候必须指明类型int。...自C++17起引入了新的特性Class Template Argument Deduction,简称为CTAD,即模板参数推导,那么就可以像如下这样实例化ADD: int main(){ Add...限制 虽然CTAD用起来很方便,但是相对于不使用CTAD特性,有时候CTAD会存在一些问题,即编译器推导的类型并不是我们所预期的,仍然使用第一节的例子: int main() { Add ts("...: Add(const char*, const char*) -> Add; 需要注意的是,这一行类型推导需要加在声明之后,这样编译器遇到参数为const cha*的时候

25720

【笔记】《深入理解C++11》(下)

注意此时的构造函数函数体必须为空, 所有成员都只能依靠常量表达式初始化列表初始化 常量表达式不能用于virtual 常量表达式函数不需要重写非常量版本, 编译器会自动生成, 重写反而会报错 当模板函数声明为常量表达式后...模板类型后面的三个点...称为模板参数包, 模板参数包也可以是特化的 推导后的模板参数包再通过参数名称后的三个点...来进行解包(包扩展) 变长模板自然也可以用在函数模板, 称为函数参数包....注意函数参数包必须是函数的最后一个参数包(模板参数包没有这个要求) 模板参数包可以以下七个位置展开, 但是不用太关注, 这些展开位置基本覆盖常见需求: 表达式 初始化列表描述列表 成员初始化列表...模板参数列表 通用属性列表 lambda捕捉列表 理解包扩展的核心是谨记其将...前面的直接成员进行多次使用 C++11还引入了sizeof...()操作符来计算参数参数数量, 返回一个size_t...C++17) 用于switch, 表明此case没有break是预期内的行为, 只是一种提示 [[nodiscard]] (C++17) 目标的返回值不应放弃 [[maybe_unused]] (C+

1K30

【新技术分享】C++17 最新进展

会议进行的时候,大家都在忙着修订自己的文件,会议之后,大会会收集改好的文件,几周之后发布。但是这一次,委员会修改了他们的系统,所以得到早些版本的文件非常简单,这些邮件就是公开的。...如果你想知道这次会议的主要内容,请阅读下面的内容(我已经知道了绝大多数关于C++17库的内容,但是要将其全部写出来还是需要一定的时间) ?...核心主题 1274.常见的非终结符表达式和内嵌初始化列表 1391.非推导模板参数参数类型的转化 1722.lambda函数指针转换函数应该不例外吗?...2019.存储时间描述成员引用的省略 2024.依赖类型和未解包的参数包 2026.Zero-initialization和constexpr 2027.指定多个alignas的需求不明 2031....&&的不兼容 2052.模板参数推导vs重载操作符 2075.传递短初始化列表给数组引用参数 2101.对类型和值的依赖的错误说明 2120.数组作为标准布局的第一个非静态成员变量 库主题 1169.

1.1K60

c++17好用的新特性总结

c++17新特性有: 1、对auto表达式推导的规则进行了改变; 2、lambda表达式可以捕获“*this”; 3、新增inline变量,可以直接将全局变量定义头文件; 4、条件表达式中支持初始化语句...这是因为 当用于auto声明变量的表达式是{}括起来的,推导的型别就会变成 std::initializer_list。 C++17,对auto表达式推导的规则进行了改变。...有兴趣的朋友可以看看下面两篇文章: 《c++ inline variable 内联变量 c++17》 《GCC,Clang C模式,较低优化等级下,链接器对内联函数报未定义错误,为什么?》...同时try_emplace参数列表中将key和value分开,因此进行原地构造的语法比emplace更加简洁。...std::forward_as_tuple("c"), std::forward_as_tuple(10, 'c')); // try_emplace可以直接原地构造,因为参数列表

3K10

Modern c++快速浅析

模板类型推导 模板类型推导中最重要的是弄清它什么时候会抛弃引用,什么时候会抛弃常量性 •template void func(T& param);在这个示例函数,如果传递进是一个...C++11,Lambda表达式的参数需要具体的类型声明 auto MyLambda = [](int a, int b) { return a + b; }; auto用于Lambda表达式时,同样代表遵循模板类型推导的原则...,例如C++11可以将其用于匿名函数参数推导 // 使用auto接住匿名函数,匿名函数使用auto进行参数推导,匿名函数的返回值使用auto推导 auto MyLambda = [](auto a...; } C++17,新增了constexpr的用途,可以用在_if-else_语句中,称作_if-constexpr_,常用于模板元编程。...Lambda表达式 Lambda表达式其实是块语法糖,其结构如下 [函数对象参数](函数参数列表) mutable throw(类型)->返回值类型 { 函数语句 }; •当捕获的是this时,lambda

15810

C++17 fold expression

1.简介 C++11增加了一个新特性变参模板(variadic template),它可以接受任意个模版参数参数包不能直接展开,需要通过一些特殊的方法,比如函数参数包的展开可以使用递归方式或者逗号表达式...op代表运算符,pack代表参数包,init代表初始值。...(2)不指定初始值的为一元折叠表达式,而指定初始值的为二元折叠表达式。 (3)初始值右边的为右折叠,展开之后从右边开始折叠。而初始值左边的为左折叠,展开之后从左边开始折叠。...…左即二元左折叠,参数包…右即右折叠。...template 参考文献 [1]C++17那些值得关注的特性(上) [2]C++17尝鲜:fold expression(折叠表达式)

1.7K30

第七章 函数

型函数 int Add(int x, int y) { return x + y; } 函数详解 参数 函数可以函数头的小括号包含零到多个形参 包含零个形参时,可以使用void标记 对于非模板函数来说...+17标准强制忽略,C++17标准之前由编译器决定 } -fno-elide-constructors忽略C++11(C++17标准之前)对复制临时对象强制忽略的约束 函数传值、传址、传引用 #include...使用省略号表示形式参数 函数可以定义缺省实参 如果某个形参具有缺省实参,那么它右侧的形参都必须具有缺省实参 一个翻译单元,每个形参的缺省实参只能定义一次 具有缺省实参的函数调用时,传入的实参会按照从左到右的顺序匹配形参...) C++14引入的方式:返回类型的自动推导 使用constexpr if构造“具有不同返回类型”的函数,接收常量表达式 返回类型与结构化绑定(C...++17)语法糖 [[nodiscard]]属性(C++17) 表明返回值很重要需要保留 函数重载与重载解析 函数重载:使用相同的函数名定义多个函数,每个函数具有不同的参数列表(参数个数或者参数类型不同

16930

从零开始一起学习SLAM | C++新特性要不要学?

本文所谓的C++新特性是指C++11及其以后的C++14、C++17增加的新关键字和新语法特性。...其中C++11是C++98以来最重要的一次变化,而其后的C++14、C++17该基础上的完善和补充。 那么,问题来了,如果我不想学习新特性,还是像以前那样编程可以吗?...2、省心省力的自动类型推导 C++11引入了auto,可以用来进行自动类型推导,不用关心数据类型,编译器会帮你推导好,而且这种方式也不影响编译速度。...5、随心所欲可变长的参数模板 Python和MATLAB可以非常方便的使用可以变长的参数,C++11以后引入了tuple,可以实现类似功能,并且可以传入多个不同类型的数据,如下图所示 ?...本程序学习目标: 熟悉C++新特性(简化循环、自动类型推导列表初始化、lambda函数) 题目: ? 正确输出结果: ? 如果想要下载以上代码框架,公众号菜单栏回复:11,即可。

75020

C++发展概述

C++是一门以C为基础发展而来的一门面向对象的高级程序设计语言,从1983年由Bjarne Stroustrup教授贝尔实验室创立开始至今,已有30多个年头。...第一个版本的C++,因其面向对象的思想使得编程变得简单,并且又保持了C语言的运行效率,推出的一段时间内,得到了快速的发展,占据了编程语言界的半壁江山。...近年来,C++标准的变更周期缩短,由C++11到C++14以及最近的C++17都只用了3年的时间。C++14引入了二进制文字常量、将类型推导从Lambda函数扩展到所有函数、变量模板以及数字分位符等。...C++14 是对 C++11的重要补充和优化,是C++发展历程的一个小型版本,虽然新增的内容较少,但是仍然为用户“带来了极大的方便”,为实现使C++“对新手更为友好”这一目标作出努力。...C++17引入了许多新的特性,比如模板参数推导、UTF-8文字常量、fold表达式、新类型以及新的库函数等。 C++仍在不断的发展,下一个版本将是C++20,C++历史上的标准变更如下。

69410

【C++】C++11 新特性

、右值引用、智能指针、标准线程库等 C++14 对C++11的扩展,主要是修复C++11漏洞以及改进,比如:泛型的lambda表达式,auto的返回值类型推导,二进制字面常量等 C++17 C++11...---- 三、初始化列表 1、统一使用 {} 初始化 C++98,标准允许使用花括号 {} 对数组或者结构体元素进行统一的列表初始值设定。...---- 十一、可变参数模板 1、可变参数模板的语法 C语言中我们使用 … 来表示可变参数,比如 printf 和 scanf 函数,C++ 沿用了这个用法: 可变参数模板的形式 但 C++ 也与...“参数包”,它里面包含了0到N(N>=0)个模版参数参数参数的个数 可变参数的函数模板我们可以使用 sizeof…(args) 来求得参数参数的个数: 2、取出参数的每个参数 既然可以使用... C++11 标准引入了 std::function 模板,其定义 头文件

1.3K10

C++11-列表初始化变量类型推导范围forfinal&override默认成员函数控制

{}对数组元素进行统一的列表初始值设定 示例: int array1[] = {1,2,3,4,5}; int array2[5] = {0}; 注:对于一些自定义的类型,却无法使用这样的初始化...,该类模板主要有三个方法:begin()**、**end()迭代器以及获取区间中元素个数的方法size() 三、变量类型推导 1、auto类型推导 定义变量时,必须先给出变量的实际类型,编译器才允许定义...为什么需要decltype: auto使用的前提是:必须要对auto声明的类型进行初始化,否则编译器无法推导出auto的实际类型 但有时候可能需要根据表达式运行完成之后结果的类型进行推导,因为编译期间...,推导函数的类型 cout << typeid(decltype(GetMemory)).name() << endl; // 如果带参数列表推导的是函数返回值的类型,注意:此处只是推演,不会执行函数...C++对于空编译器会生成一些默认的成员函数,如果在显式定义了,编译器将不会重新生成默认版本 有时候这样的规则可能被忘记,最常见的是声明了带参数的构造函数,必要时则需要定义不带参数的版本以实例化无参的对象

69660
领券