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

在C++11和C++14中有没有使用字符指针数组定义的constexpr的替代品?

在C++11和C++14中,没有直接使用字符指针数组定义的constexpr的替代品。在这两个版本中,constexpr关键字主要用于声明常量表达式,以便在编译时求值。它可以用于定义常量值、函数和构造函数。

在C++11中,constexpr函数可以包含一些简单的控制流语句,但不能包含循环语句。在C++14中,constexpr函数的限制更加宽松,可以包含一些简单的循环语句。

然而,在C++11和C++14中,如果你想使用字符指针数组定义一个constexpr,你需要使用其他的技巧。一种常见的方法是使用std::array来替代字符指针数组,并将其声明为constexpr。std::array是一个固定大小的数组容器,提供了更好的类型安全性和更多的功能。

下面是一个示例代码:

代码语言:txt
复制
#include <array>

constexpr std::array<const char*, 3> myArray = { "Hello", "World", "!" };

int main() {
    // 使用constexpr定义的std::array
    constexpr auto size = myArray.size(); // 获取数组大小
    constexpr auto element = myArray[0]; // 获取数组元素

    // 其他操作...
    
    return 0;
}

在上面的示例中,myArray是一个包含3个常量字符指针的std::array,它被声明为constexpr,可以在编译时求值。你可以使用size()方法获取数组的大小,使用[]运算符访问数组的元素。

需要注意的是,虽然C++11和C++14中没有直接使用字符指针数组定义的constexpr的替代品,但C++17引入了constexpr if语句,可以更灵活地在constexpr函数中使用条件语句。所以,如果你使用的是C++17或更高版本,你可以考虑使用constexpr if来实现类似的功能。

总结起来,在C++11和C++14中,没有直接使用字符指针数组定义的constexpr的替代品,但你可以使用std::array来替代字符指针数组,并将其声明为constexpr。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

constexpr常量表达式

constexpr类型构造函数(除拷贝构造函数外),所有非静态数据成员以及字面值类型基类 或者一个字面值类型数组 上面对于字面值类型定义还牵涉到平凡类型(trivial type),另一篇博文会讲到...尽管我们可以定义一个const变量并把它初始值设为我们认为某个常量表达式,但在实际使用时,尽管要求如此,却常常发现初始值并非常量表达式情况。因此,对象定义使用根本就是两回事儿。...1.函数体被声明为constexpr 2.非虚函数 3.返回类型及所有形参类型都必须是字面值类型 4.函数中有且只有一条return语句(C++14标准中这条规定被删除) constexpr...int new_sz () {return 24;} constexpr int foo = new_sz(); C++11中关于constexpr函数定义参考链接:cppreference C...其它函数不一样,内联函数constexpr函数可以程序中多次定义。毕竟,编译器要想展开函数仅有函数声明时不够,还需要函数定义

36310

Modern c++快速浅析

因为这是一个拷贝指针操作,因此保留原指针不可更改指向性并没有太大意义 auto 大多数情况下auto推断出来结果模板类型推导结果是一样,不同点在于对大括号初始物处理 值与指针等推导 const...constexpr constexpr代表编译期常量,它所标识值可能被放入到只读内存段中,如数组,非类型模板参数,枚举类型等要求都是编译期常量,const代表运行期常量。...泛用性每代C++中都得到了提高 C++11中,constexpr可以用来修饰对象(包括内置类型定义类型),以及可以用来修饰函数(构造函数,成员函数,普通函数等等),如果以constexpr修饰构造函数...1 : base * pow(base, exp - 1)); } C++14中,对constexpr修饰函数做了进一步拓展,C++14constexpr函数不再是只能单纯包含一条return...) 但按值捕获也不一定能保证悬垂安全,例如对this指针捕获 初始化捕获 初始化捕获是C++14中引入新特性,解决了C++11中无法“移动捕获”问题(可以理解为是为Lambda生成匿名类创建并初始化类成员

14310

const成员函数一定是线程安全吗?

C++98中并不好用,所以大家都用情况1了 for(auto i:valuess) { cout<<i<<endl; } //情况2:C++11 获取使用...函数传入编译期常量时能够返回编译期结果,它们实现就必须加以限制,而在C++11C++14中,这样限制还有所不同 //C++11constexpr函数不得包含多于一个可执行语句,即一条return...//注意 c++11 中有两个限制规定如下不能定义constexpr //1, 它们修改了操作对象,c++11constexpr函数都隐式地被声明为 const...,一个返回赋值返回参数 */ //1, 拷贝构造函数 class XML{ public: //默认构造函数: 不带任何参数,没有定义其他构造函数情况下,编译器会自动生成默认构造函数...,编译器会自动生成拷贝构造函数 /** 注意两点: 1, 类中存在指针,会出现深拷贝浅拷贝问题,此时必须自定义拷贝构造函数实现深拷贝

1K20

C++14新增特性汇总

C++14整体来说只是发行一个小版本,C++11大版本基础上做了一些优化缺陷修复。C++142014年8月18日正式批准宣布,同年12月15日正式发布release版本。...,使用方法如下: template constexpr T pi = T(3.1415926535897932385L); // 变量模板 实际编码中,C++14以前如果要实现上面的功能...3 constexpr放松限制 使用constexpr-描述符后,指定变量或函数值可以常量表达式中使用。...C++11中,constexpr只能只用递归,C++14后进行了优化提升,可以使用局部变量循环。且不用将所有的语句放在一条return语句中进行编写。...(x==y)<<std::endl; return 0; } 代码输出结果为:1 5 函数返回值推导 C++11使用后置类型推导函数返回值,C++14起,可以省略,返回值使用auto,编译器直接将函数体中

44510

Chapter 3: Moving to Modern C++

,也没有一个指针类型,但是可以代表所有类型指针,nullptr实际类型是nullptr_t,可以被隐式地转换成所有原始指针类型 f(nullptr); // calls f(void*) 当在使用模板时...它们值也许会被放在只读内存区中,它们值也能被用在整型常量表达式中,例如数组长度,整型模板参数,枚举值,对齐指示符等等 当constexpr函数使用constexpr对象时,它们会产生编译期常量,如果...constexpr函数使用了运行时值,它们就会产生运行时值,但是如果constexpr函数使用所有参数都是运行时值,那么就会报错 C++11中,constexpr函数只能包含不超过一条return...C++14中,constexpr函数语句数量没有限制,但是函数必须接收返回字面值类型,也就是指可以在编译期间确定值类型。...字面值类型包括除了void修饰类型带有constexpr修饰用户自定义类型(因为构造函数其他成员函数也可能是constexpr) class Point { public:

1.8K60

机器人CPP编程基础-03变量类型Variables Types

复合类型(如数组指针、引用等)进一步扩展: 指针数组数组元素是指针类型。例如int *arr[5]定义了一个包含5个指向整数指针数组。...这些是C++中主要变量类型。根据需要,还可以创建自定义类型结构,以满足特定编程需求。 C++14引入了一些新变量类型,这些类型C++11C++17中都有所扩展。...原子类型包括整数、浮点数指针类型。 atomic:定义了一个原子操作基本类型。原子操作是一种单个线程中执行操作,它可以没有其他线程干扰情况下修改数据。...atomic_flag:定义了一个原子标志,可以用于实现简单原子布尔操作。 数组初始化:C++14引入了一种新数组初始化方法,允许使用花括号{}进行初始化。...指针类型 int *p;:定义一个指向整数指针。 char *str;:定义一个指向字符数组指针数组类型 int arr[10];:定义一个包含10个整数数组

14820

C++17常用新特性(十)---模板特性:字符串变量当做模板参数

C++历次版本发布中,对C++模板参数标准一直保持开放态度,且对参数要求也逐渐放宽。从C++17开始,非类型模板参数也可以使用定义了而不必定义不同作用域。...1 模板中使用字符模板编程中,非类型模板参数被限制了诸多条件,只能从以下几种类型中获取,如:枚举、对象、指针、常量以及函数左值引用、字符串变量。...对于字符串变量,使用方式之前版本并没有太大区别,都不能直接在模板类型参数中使用。...: ExecptionMsg msgError; 编译将会报错,报错信息如下: 由此可见,非类型模板参数中,字符变量是不能直接使用使用之前需要先进行定义。...2 将指针作为模板实参 从C++11开始,已经允许将指针作为模板实参,但是还有一个限制,既模板实例化时不能将一个返回指针函数当做模板实参。

1.4K30

C++17, 语言核心层有哪些新变化?

看到一个介绍 C++17 系列博文(原文),有十来篇样子,觉得挺好,看看有时间能不能都简单翻译一下,这是第一篇~ C++11, C++14, 以及 C++17.....如果你熟悉C++,那么你一定知道 C++98(第一个C++标准) C++11 是两个非常大C++标准, 但C++14,特别是C++03则是两个小标准....从我观点来看,答案其实挺简单: C++17 介于 C++14 C++11 之间,既不属于大标准也不属于小标准,至于原因,看看下面的说明吧....行代码从C++第一个标准开始(C++98)便是合法,但是25行及26行代码则只能在C++17中编译通过,因为C++17之前,你必须使用尖括号()来指定需要实例化类模板类型参数....,但RVO一直都只是一种可能优化步骤(并没有标准规范,编译器可以选择进行RVO或者不进行RVO),C++17中通过定义 guaranteed copy elision 保证了这种优化执行.

77020

C++17常用新特性(六)---lambda表达式扩展

C++11起就引入了lambda表达式,C++14又对其进行了丰富,开始支持使用泛型lambda。到现在C++17 lambda功能又进行了扩展。...这些上下文环境主要包含场景有:只使用字面变量、没有静态类型、没有虚函数、没有异常捕获及new/delete上下文环境。...但是它依然可以在运行期使用,试着将第6行代码段进行注释,那么代码可以继续编译且打印出计算结果。 同样,如果在上面代码中显示定义constexpr。...2 constexpr lambda使用 下面的例子主要演示了lambda中使用constexpr,代码分别在编译期运行期调用lambda场景,代码如下: auto hash = [](const...hv1{hashed("wine"), [](auto h, char c) {return h*33 + c;})}; 3 向 lambda 传递 this 拷贝 C++11或者C++14中,

86820

每个开发者都应该了解一些C++特性

第 7 第 8 行中,我使用了花括号初始化。这个特性也是 C++11 中新加入。 记住,当使用 auto 时,必须确保你编译器可以通过某种方式推断数据类型。...另一种非常普遍应用是将其作为比较函数。 ? 上面的例子中有很多细节。 首先,要注意到列表初始化为你节省了多少代码。然后是通用 begin() end(),它们同样也是 C++11 中新添加。...这里使用方括号[]作为 lambda 表达式开始。它定义了 lambda 函数作用域,即它对局部变量对象有多少权限。 下面是一些现代 c++中相关定义: []代表空。...因此你不可以 lambda 表达式中使用任何外部作用域局部变量。只可以使用参数。 [=]代表可通过值获取作用域内局部对象(局部变量参数),即你只可以使用但不可修改。...有趣是,之后 c++17 中,又引入了 constexpr-if constexpr-lambda。 tuple pair 非常相似,tuple 是一组各种数据类型固定大小值集合。

73820

C++ 中 const constexpr关键字解析:常量、函数指针

C++11中引入一个关键字,它作用主要是用来修饰一些函数变量,使其成为常量表达式,从而在编译器就可以进行计算,进一步提高程序运行期效率 常量表达式:指的是有一个或多个常量组成表达式,实际开发中经常会接触到常量表达式...还可以用于修饰函数返回值,C++11中被constexpr修饰函数只能是非void类型函数,而且必须非常简短,通常只有一句return表达式。...不过在后续C++14/17/20标准中进一步放宽了这了限制,都可以通过编译了 constexpr int test() { return 1 + 1; } 修饰构造函数 constexpr还可以用于修饰自定义类型...Student s{"zhangsan", 18}; s.print(); } 总结 const可以修饰编译期运行期常量,而constexpr只能修饰编译期常量 const仍然可以通过...const_cast类型转换来修改值,而constexpr是不可以修改,其实可以将const理解为只读变量更符合其含义 const只能用于非静态成员函数,而constexpr可以成员,非成员,构造函数一起使用

68720

现代C++之constexpr

现代C++之constexpr constexpr C++11 引入、 C++14 得到大幅改进。...因此,const变量既可以定义编译时常量(比如size1)来指定数组大小,也可以定义运行时常量(比如size2)来定义数组大小。另一方面,constexpr总是定义可以指定数组大小编译时常量。...; constexpr 函数当使用在编译期间已知值参数调用时,constexpr函数产生编译时结果; 与非constexpr对象函数相比,constexpr对象函数可以更广泛上下文中使用; constexpr...5.补充 内联变量C++17 引入了内联(inline)变量概念,允许头文件中定义内联变量,然后像内联函数一样,只要所有的定义都相同,那变量定义出现多次也没有关系。...这是因为 ODR(下面的one definition rule)-use 类静态常量也需要有一个定义没有内联变量之前需要在某一个源代码文件(非头文件)中这样写: const int magic::

1.2K20

真没想到nullptrNULL得区别,大了去了

第3章 转向现代C++ 条款7:创建对象时注意区分(){} //创建对象时候注意区分 () {} //指定初始化方式有:小括号,等号,大括号 //情况1:内建型别来说 int 初始化赋值没有区别...,所有使用大括号来完成对象默认构造没有问题 //大括号解决第三类问题:构造函数形参中 具备 std::initializer_list型别 //1, 如果没有以上型别,() {} 没有区别 class...//区别一:处理函数指针理解性 //区别一:处理函数指针理解性 //FP型别是一个指涉到函数指针,该函数形参包括一个 int 一个 const std::string&, 没有返回值 typedef...没有定义 }; //C++11中 delete将复制构造函数复制赋值运算符标识为删除函数 //C++11中 delete将复制构造函数复制赋值运算符标识为删除函数 template<class charT...* 指针表示得式C风格得字符串,不是指涉到单个字符指针 //假定采用这两个型别时拒绝调用,不可以使用 void* char* 来调用 processPointer //删除来具体实现 //删除来具体实现

1.7K30

C++ 关键字constexpr

constexprC++11 引入一个关键字,用于指定表达式或函数值在编译时就可以确定。使用 constexpr 可以在编译期进行优化,从而提高程序运行效率。...函数只能调用其他 constexpr 函数。 函数参数返回类型必须是字面类型(例如,整数、浮点数、指针、字面类类型对象等)。...用于类构造函数unsetunset C++11 及更高版本中,类构造函数也可以被标记为 constexpr。 这意味着使用该构造函数创建对象可以在编译时初始化。... C++14 及更高版本中,constexpr 函数可以包含多个语句,但仍需满足编译时计算要求。...通过使用 constexpr,开发者可以创建更加高效优化代码,特别是需要编译时常量或模板元编程场景中。 请注意,以上信息基于 C++11 及其后续版本。

11810

c++17好用新特性总结

C++1411基础上查缺补漏,并未加入许多新特性,而C++17作为C++11第一个大版本,标志着现代C++逐渐走向成熟。......... 1.auto关键字 从c++11开始,auto关键字能够通过初始化器推导出变量类型。c++14中,auto关键字能力进一步提升,能够通过return语句推导出函数返回类型。...c++17之前,只能自己通过独占锁条件变量自己实现读写锁或使用c++14加入性能较差std::shared_timed_mutex。...“视图”,类成员变量包含两个部分:字符指针字符串长度,std::string_view涵盖了std::string所有只读接口。...平时代码中可以大规模使用一个特性。其实对于string争论一直没有停止过,很多人认为string是字节串而不是字符串,因为string是可以改变,这一切争论到C++17可以停止了。

2.8K10

C++constexpr

constexprC++11引入关键字,用于定义在编译时求值常量表达式。它可以修饰函数、对象模板参数,并要求其在编译时就能够得到计算结果。...常量折叠:当使用constexpr定义多个常量并进行计算时,编译器会尝试在编译时将它们合并为一个常量,以进一步优化代码。...宏替代:使用constexpr可以取代宏,在编译时执行计算逻辑操作,避免了宏带来一些问题(如类型安全性可读性)。...需要注意是,C++11中,对于constexpr函数对象,编译器要求比较严格,限制了函数复杂性对象初始化方式。...但是,随着C++14C++17发布,对constexpr限制逐渐放宽,允许使用更复杂控制流语句、递归调用和局部变量等,提供了更大灵活性。

16820

c++11新特性,所有知识点都在这了!

nullptr nullptr是c++11用来表示空指针新引入常量值,c++中如果表示空指针语义时建议使用nullptr而不要使用NULL,因为NULL本质上是个int型0,其实不是个指针。...但父类却没有这个虚函数,编译报错,使用override关键字可以避免开发者重写基类函数时无意产生错误。...char *const ptr; // 指针本身是常量 const char* ptr; // 指针指向变量为常量 函数参数中使用const,一般会传递类对象时会传递一个const引用或者指针,这样可以避免对象拷贝...c++11中是不是方便了许多,而不需要定义一个对象,计算对象成员大小。...,内部不会排序,使用方法set类似 std::unordered_map:基于hash表实现map,内部不会排序,使用方法set类似 std::array:数组越界访问时抛出异常,建议使用std

17.2K22

C++14新特性扫盲探究

闲暇之时,聊到C++14,实际上C++14相对之前11并没有太大改动,或者说更像C++11标准基础上查漏补缺,C++14之后,还有17、20甚至23,所以说,C++14更像个过渡版本。...下面粗略聊聊C++14新特性:图片语言特性:初始化列表(Initializer lists):允许构造函数中使用初始化列表来初始化成员变量。...constexpr(常量表达式):允许在编译时计算常量表达式值,提高代码性能效率。auto类型推断:可以使用auto关键字来自动推断变量类型,简化代码并提高代码可读性。...扩展模板参数(Expanded template parameters):允许模板中使用更多参数,提高代码可读性可维护性。...std::exception_ptr(异常指针):允许异常处理过程中保存异常信息,以便稍后处理。

29000
领券