นี่คือ C ++ ที่ถูกต้องหรือไม่
int main() {
constexpr auto sz = __func__ - __func__;
return sz;
}
GCC และ MSVC คิดว่ามันตกลงดังกราวคิดว่ามันไม่ได้: คอมไพเลอร์ Explorer ที่
คอมไพเลอร์ทุกคนยอมรับว่าอันนี้ตกลง: คอมไพเลอร์ Explorer ที่
int main() {
constexpr auto p = __func__;
constexpr auto p2 = p;
constexpr auto sz = p2 - p;
return sz;
}
เสียงดังกราวอีกครั้งไม่ชอบอันนี้ แต่อันอื่นก็โอเคกับมัน: 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__));
}
เสียงดังกราวคิดeq(__func__, __func__)ไม่ได้แสดงออกอย่างต่อเนื่องแม้ว่าจะstd::equal_to::operator() เป็น constexpr คอมไพเลอร์อื่น ๆ ไม่บ่น: Compiler Explorer
เสียงดังกราวจะไม่รวบรวมอันนี้เช่นกัน บ่นว่า__func__ == __func__ไม่ใช่นิพจน์คงที่: Compiler Explorer
int main() {
static_assert(__func__ == __func__);
}
__func__และใช้มันใน static_assert ...
__func__จากการประเมิน constexpr ทั้งหมด
__func__เป็นถ้าstatic const char __func__[] = "function-name";และเทียบเท่าเป็นที่ยอมรับสาธิต ...