这是有效的C ++吗?
int main() {
constexpr auto sz = __func__ - __func__;
return sz;
}
GCC和MSVC认为可以,而Clang认为不可以:Compiler Explorer。
所有编译器都同意这是可以的:Compiler Explorer。
int main() {
constexpr auto p = __func__;
constexpr auto p2 = p;
constexpr auto sz = p2 - p;
return sz;
}
Clang再次不喜欢这个,但是其他的都可以:Compiler Explorer
int main() {
constexpr auto p = __func__;
constexpr auto p2 = __func__;
constexpr auto sz = p2 - p;
return sz;
}
这是什么 我认为对不相关的指针进行算术运算是未定义的行为,但是__func__
返回相同的指针,不是吗?我不确定,所以我想我可以测试一下。如果我没记错的话,std::equal_to
可以比较不相关的指针而没有未定义的行为:
#include <functional>
int main() {
constexpr std::equal_to<const char*> eq{};
static_assert(eq(__func__, __func__));
}
Clang认为eq(__func__, __func__)
不是常量表达式,即使std::equal_to::operator()
是constexpr。其他编译器不抱怨: 编译器资源管理器
Clang也不会编译这个。抱怨__func__ == __func__
不是一个常量表达式:Compiler Explorer
int main() {
static_assert(__func__ == __func__);
}
__func__
并在static_assert中使用该变量,它会起作用...
__func__
就好像static const char __func__[] = "function-name";
并且接受了等效演示 ...