constexpr和之间有什么区别const?
我正在研究核心常量表达式*中允许的内容,这在C++标准草案的5.19 常量表达式第2段中有所描述:
条件表达式是核心常量表达式,除非它涉及以下之一作为潜在评估的子表达式(3.2),但是未评估的逻辑AND(5.14),逻辑OR(5.15)和条件(5.16)操作的子表达式不考虑[注意:重载的运算符调用函数.-end note]:
并列出随后的子弹中的排除项并包括(强调我的):
- 具有未定义行为的操作 [注意:包括,例如,有符号整数溢出(第5条),某些指针算术(5.7),除零(5.6)或某些移位操作(5.8) - 结束注释];
嗯?为什么常量表达式需要此子句来涵盖未定义的行为?常量表达式是否有一些特殊的东西需要未定义的行为才能在排除中进行特殊划分?
拥有这个条款是否给了我们没有它的任何优势或工具?
作为参考,这看起来像广义常量表达式提案的最新修订版.
我写了一个可变参数模板,它接受可变数量的char参数,即
template <char... Chars>
struct Foo;
Run Code Online (Sandbox Code Playgroud)
我只是想知道是否有任何宏技巧允许我使用类似于以下语法实例化它:
Foo<"abc">
Run Code Online (Sandbox Code Playgroud)
要么
Foo<SOME_MACRO("abc")>
Run Code Online (Sandbox Code Playgroud)
要么
Foo<SOME_MACRO(abc)>
Run Code Online (Sandbox Code Playgroud)
等等
基本上,任何阻止你单独写字符的东西,就像这样
Foo<'a', 'b', 'c'>
Run Code Online (Sandbox Code Playgroud)
这对我来说不是一个大问题,因为它只是一个玩具程序,但我想我还是会问.
C++编程语言第四版 - Bjarne Stroustrup :(强调我的)
2.2.3.常量
在少数地方,语言规则需要常量表达式(例如,数组边界(§2.2.5,§7.3),案例标签(§2.2.4,§9.4.2),一些模板参数(§25.2),以及使用constexpr声明的常量).在其他情况下,编译时评估对性能很重要. 与性能问题无关,不可变性(具有不可更改状态的对象)的概念是一个重要的设计问题(第10.4节).
似乎Stroustrup在这里建议constexpr确保一个对象的不变性比传统的const声明更好.它是否正确?是否有方法,使constexpr可以更安全/比不易挥发const,或不斯特劳斯只意味着因为有很多方法可以使用constexpr不与支持const(见是constexpr真正需要的?),在这种情况下不变性可以使用保证constexpr?
是否有任何例子,模板元编程比新的constexpr更好用?根据我的理解,constexpr和模板元编程都有类似的用途,但模板元编程并不过时.因此,必须有一些示例,其中模板元编程优于constexpr.对此有任何共同的想法将非常感谢,谢谢!
如何在c ++中创建一个函数来确定两个输入的数字是否相对为素数(没有公因子)?例如,"1,3"将是有效的,但"2,4"不会.