Bu geçerli C ++ mı?
int main() {
constexpr auto sz = __func__ - __func__;
return sz;
}
GCC ve MSVC iyi olduğunu düşünüyor, Clang bunun olmadığını düşünüyor: Derleyici Gezgini .
Tüm derleyiciler bunun uygun olduğunu kabul eder: Derleyici Gezgini .
int main() {
constexpr auto p = __func__;
constexpr auto p2 = p;
constexpr auto sz = p2 - p;
return sz;
}
Clang yine bunu sevmiyor, ancak diğerleri bununla iyi durumda: Compiler Explorer
int main() {
constexpr auto p = __func__;
constexpr auto p2 = __func__;
constexpr auto sz = p2 - p;
return sz;
}
Burada ne var? Ben ilişkisiz işaretçiler aritmetik tanımsız davranış olduğunu, ancak __func__
aynı işaretçiyi döndürür, hayır? Emin değilim, bu yüzden test edebileceğimi düşündüm. Doğru hatırlıyorsam, std::equal_to
tanımlanmamış davranış olmadan ilgisiz işaretçileri karşılaştırabilirsiniz:
#include <functional>
int main() {
constexpr std::equal_to<const char*> eq{};
static_assert(eq(__func__, __func__));
}
Clang , constexpreq(__func__, __func__)
olmasına rağmen sabit bir ifade olmadığını düşünüyor . Diğer derleyiciler şikayet etmiyor: Derleyici Gezginistd::equal_to::operator()
Clang bunu da derlemeyecek. __func__ == __func__
Sabit bir ifade olmayan şikayetler : Derleyici Gezgini
int main() {
static_assert(__func__ == __func__);
}
__func__
kullanırsanız çalışır ...
__func__
constexpr değerlendirme tamamen.
__func__
olarak -eğer olduğunustatic const char __func__[] = "function-name";
eşdeğer kabul edilir ve bu Demo ...