【发布时间】:2021-11-27 07:44:31
【问题描述】:
在 C++17 中的常量表达式求值期间,编译器是否应考虑任何指向有效对象的指针与任何指向其生命周期结束后的对象的指针不同?
例如:
constexpr auto f(int * x = nullptr) {
int c = 0;
auto p = &c;
if ( x == p )
throw "unexpected";
return p;
};
int main() {
static_assert( f( f() ) );
}
这里函数f()的内部调用返回一个悬空指针,再次传递给f。我相信条件x == p 一定是false,因为x 是一个悬空指针,p 是一个有效指针,在Clang 中确实如此。但在 GCC 中,条件得到满足,并且由于throw 而不断评估失败。演示:https://gcc.godbolt.org/z/ehcMro17q
这是未定义的或实现定义的行为,还是其中一个编译器有误?
【问题讨论】:
-
这是一个更简单的 MWE,它暴露了相同的行为,据我所知:gcc.godbolt.org/z/sbsK6x775
-
AFAIK 返回指向局部变量的指针是未定义的行为,因此任何事情都可能发生。
标签: c++ c++17 language-lawyer constexpr dangling-pointer