Trong mẫu mã sau, if
câu lệnh phụ thuộc vào bool
tham 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
else
nhánh thiếu chuyên môn hóa chotrue
giá 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á
if
câ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