当前位置:  开发笔记 > 编程语言 > 正文

可以添加'constexpr'来改变行为吗?

如何解决《可以添加'constexpr'来改变行为吗?》经验,为你挑选了1个好方法。

鉴于源代码中唯一不同的两个程序是否存在constexpr,程序的含义是否可能发生变化?

换句话说,如果有一个编译器选项要求编译器尝试很难推断constexpr可能的地方,它会破坏现有的标准代码和/或以不好的方式改变其含义吗?

想象一下处理一个代码库,原始开发人员忘记将其包含constexpr在可能的地方,也许是在C++ 11之前编写的代码.如果编译器推断constexpr可以帮助您继续工作,那将会很棒.当然,或许它也应该在每次进行推理时发出警告,鼓励你明确添加constexpr后者.但它仍然有用.我担心它会破坏东西吗?

到目前为止,我唯一能想到的是constexpr函数是隐含的,inline并且可能存在添加inline可能以不良方式改变事物的情况; 例如,如果您违反了单定义规则.



1> Yakk - Adam ..:

有一个简单的伎俩:

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),才会调用第二个重载(或者,如果有人将参数传递给它).


@AaronMcDaid错误是在直接上下文中,因此我们得到替换失败而不是错误.SFINAE意味着几乎任何"签名"更改(甚至存在!)都可能导致C++中不同的编译时和运行时行为,并且几乎无法完全符合任何接口的扩展.然而,发生这种情况的情况(在每种情况下我都看到过,包括上面)*病态*.
推荐阅读
农大军乐团_697
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有