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