鉴于源代码中唯一不同的两个程序是否存在constexpr
,程序的含义是否可能发生变化?
换句话说,如果有一个编译器选项要求编译器尝试很难推断constexpr
可能的地方,它会破坏现有的标准代码和/或以不好的方式改变其含义吗?
想象一下处理一个代码库,原始开发人员忘记将其包含constexpr
在可能的地方,也许是在C++ 11之前编写的代码.如果编译器推断constexpr
可以帮助您继续工作,那将会很棒.当然,或许它也应该在每次进行推理时发出警告,鼓励你明确添加constexpr
后者.但它仍然有用.我担心它会破坏东西吗?
到目前为止,我唯一能想到的是constexpr
函数是隐含的,inline
并且可能存在添加inline
可能以不良方式改变事物的情况; 例如,如果您违反了单定义规则.
有一个简单的伎俩:
templatestruct i{}; int foo(int){return 0;} constexpr int foo(char){return 'a';} template * =nullptr> bool bar(){return true;} template bool bar(Ts...){return false;}
如果int foo(int)
是constexpr,bar
则默认选择不同的重载.
运行不同的代码时,可能会发生任何行为更改.
实例(只需更改#define X
注释掉).
设计示例:
在char
过载防止上述代码被非法的构造,没有诊断必需的,因为所有的模板都必须有一个有效的专门化. foo
供应那个.在实践中,它的存在不是必需的:ADL可以foo
从远处找到一个,在a上重载some_type*
,然后传递some_type*
为T
.这意味着没有编译单元可以证明代码是不正确的.
的Ts...
,使bar
过载-优选更少.因此,如果第一个匹配,则没有歧义.只有当第一个匹配失败时(由于foo(x)
不存在导致SFINAE constexpr
),才会调用第二个重载(或者,如果有人将参数传递给它).