นี่คือ 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";
และเทียบเท่าเป็นที่ยอมรับสาธิต ...