【发布时间】:2017-03-10 21:09:10
【问题描述】:
我有以下程序:
#include <iostream>
#define PRINT_LOCATION()\
do { std::cout << __PRETTY_FUNCTION__ << "\n"; } while (false)
struct foo
{
int val;
foo()
: val(1)
{
PRINT_LOCATION();
}
foo(const foo& other)
: val(other.val * 2)
{
PRINT_LOCATION();
}
foo(foo&& other)
: val(other.val * 2)
{
PRINT_LOCATION();
}
};
int main()
{
foo f{foo{foo{foo{}}}};
std::cout << "value = " << f.val << "\n";
if (f.val == 1)
throw f;
}
编译和执行:
[mkc /tmp]$ g++ -Wall -Wextra -pedantic -std=c++14 -O0 -o a.out main.cpp
[mkc /tmp]$ ./a.out
foo::foo()
value = 1
foo::foo(foo&&)
terminate called after throwing an instance of 'foo'
Aborted (core dumped)
[mkc /tmp]$ clang++ -Wall -Wextra -pedantic -std=c++14 -O0 -o a.out main.cpp
[mkc /tmp]$ ./a.out
foo::foo()
foo::foo(foo &&)
foo::foo(foo &&)
value = 4
[mkc /tmp]$
我知道编译器可以去掉一些构造函数调用,但不是只有在没有副作用的情况下才允许这样做吗?看起来 Clang 在这里是正确的,它是 GCC 中的错误吗?
【问题讨论】:
-
从来没有编译器必须考虑是否有副作用的情况。