参数计算和未定义行为
Parameter evaluation and undefined behavior
给出这个示例(这是boost::multi_index_container文档中关于更新回滚的示例的简化):
#include <iostream>
struct change
{
int val_;
change(int const &val) : val_(val)
{
}
void operator() (int &v) const
{
v = val_;
}
};
void do_it(int &v, change const &c1, change const &c2)
{
c1(v);
c2(v);
}
main()
{
int i = 17;
int orig = i;
do_it(i, change(11), change(orig));
std::cout << "i = " << i << std::endl;
}
这里需要显式复制i
(到orig
)吗?或者可以更简单地写成:
int i = 17;
do_it(i, change(11), change(i));
在这种情况下,调用do_it
后,i
的值是否仍然保证为17
?两个change
形参都需要在函数体执行之前构造。
语言是否保证在函数开始之前构造所有的形参?(如果没有保证,那么编译器可以延迟c2
的构建,直到c1
的operator()
运行之后,因此最终值将是11
)
函数调用的所有形参都在调用函数之前求值。参数的求值顺序未指定。
在你的例子中,i
仍然是17。
相关文章:
- 编译C++时未定义的引用
- vscode g++链路故障:体系结构x86_64的未定义符号
- 如何修复此错误:未定义对"距离(浮点数,浮点数,浮点数,浮点数,浮点数)"的引用
- 我的项目不会像"undefined reference to `grpc::g_core_codegen_interface'"那样使用未定义的引用错误进行编译
- 不知道某个东西是否被忽略会引入未定义的行为吗
- 对C宏的未定义引用,但在定义它时会出现重新定义错误
- 未定义的引用在哪里
- 编译时的 CImg 库返回对"__imp_SetDIBitsToDevice"的未定义引用
- 对Py_Initialize()的未定义引用
- c++11评估顺序(未定义的行为)
- 使用mysql c++连接器的未定义引用
- 从python调用openMP共享库时,未定义opnMP函数
- 在 Mac 上使用 CMAKE 将 FFTW 和 FFTWPP 链接到项目中时未定义的符号
- Cmake 链接问题:未定义对 Button::mousePressEvent(QGraphicsSceneMouseE
- 计算地址差异是未定义的行为吗?
- 编译器如何知道C++constexpr计算不会触发未定义的行为
- C++ [链接器错误] 未定义对"执行计算(字符,双精度)"的引用
- 正在 x86 计算机上移动超过 32 位的uint64_t整数未定义的行为
- 为什么我在某些计算机上运行Makefile时会出现“未定义引用”错误,而在其他计算机上却没有
- 参数计算和未定义行为