이것이 유효한 C ++입니까?
int main() {
constexpr auto sz = __func__ - __func__;
return sz;
}
GCC와 MSVC는 괜찮다고 생각하지만 Clang은 그렇지 않다고 생각합니다. 컴파일러 탐색기 .
모든 컴파일러는 이것이 컴파일러 탐색기 라는 것에 동의합니다 .
int main() {
constexpr auto p = __func__;
constexpr auto p2 = p;
constexpr auto sz = p2 - p;
return sz;
}
Clang은 다시이 것을 좋아하지 않지만 다른 것은 괜찮습니다. 컴파일러 탐색기
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 은 constexpreq(__func__, __func__)
이지만 상수 표현식이 아니라고 생각 합니다. 다른 컴파일러는 불평하지 않습니다 : 컴파일러 탐색기std::equal_to::operator()
Clang은 이것도 컴파일하지 않습니다. __func__ == __func__
상수 표현식이 아니라고 불평합니다 . 컴파일러 탐색기
int main() {
static_assert(__func__ == __func__);
}
__func__
사용하여 static_assert에서 constexpr 변수를 초기화 하고 사용 하면 작동합니다 .
__func__
.
__func__
같은-경우입니다static const char __func__[] = "function-name";
동등한 허용되고 그 데모를 ...