これは有効なC ++ですか?
int main() {
constexpr auto sz = __func__ - __func__;
return sz;
}
GCCとMSVCは大丈夫だと思っていますが、Clangはそうではないと思っています: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 はconstexpreq(__func__, __func__)
であっても定数式ではないと考えています。他のコンパイラは文句を言わない: Compiler Explorerstd::equal_to::operator()
Clangはこれもコンパイルしません。__func__ == __func__
定数式ではないと不平を言う:コンパイラエクスプローラ
int main() {
static_assert(__func__ == __func__);
}
__func__
それをstatic_assertで使用すると機能します...
__func__
。
__func__
as-ifでstatic const char __func__[] = "function-name";
あり、同等のものが受け入れられますデモ ...