Trong mẫu mã sau, ifcâu lệnh phụ thuộc vào booltham số mẫu, là hằng số thời gian biên dịch. Trình biên dịch xử lý mã này khác nhau:
MSVC không thành công với lỗi liên kết (đó là những gì tôi mong đợi), vì hàm mẫu trong
elsenhánh thiếu chuyên môn hóa chotruegiá trị tham số mẫu (mặc dù nó không bao giờ được gọi).Cả GCC và Clang đều biên dịch mà không có vấn đề và hành vi trong thời gian chạy là chính xác. Điều này rõ ràng là vì họ đánh giá
ifcâu lệnh tại thời điểm biên dịch và loại bỏ các nhánh không sử dụng trước khi liên kết.
Câu hỏi đặt ra là hành vi nào tuân thủ tiêu chuẩn (hoặc đó là hành vi không xác định và cả hai đều đúng theo cách riêng của họ)?
#include <iostream>
template<const bool condition>
struct Struct
{
void print()
{
if (condition)
{
std::cout << "True\n";
}
else
{
printIfFalse();
}
}
private:
void printIfFalse();
};
template <>
void Struct<false>::printIfFalse()
{
std::cout << "False\n";
}
int main()
{
Struct<true> withTrue{};
withTrue.print();
Struct<false> withFalse{};
withFalse.print();
return 0;
}
if constexpr