Câu trả lời của user143506 là đúng nhưng đối với một vấn đề hiệu suất có thể, tôi đã so sánh possibilies trong asm:
return x;
, return x != 0;
, return !!x;
và thậm chí return boolean_cast<bool>(x)
kết quả trong bộ này hoàn hảo của hướng dẫn asm:
test edi/ecx, edi/ecx
setne al
ret
Điều này đã được thử nghiệm cho GCC 7.1 và MSVC 19 2017. (Chỉ có boolean_converter trong MSVC 19 2017 dẫn đến số lượng mã asm lớn hơn nhưng điều này gây ra bởi sự biến đổi và cấu trúc và có thể bị bỏ qua bởi quan điểm thực hiện, vì cùng một lin es như đã lưu ý ở trên có thể chỉ được nhân bản cho các hàm khác nhau với cùng một thời gian chạy.)
Điều này có nghĩa là: Không có sự khác biệt về hiệu suất.
PS: boolean_cast này đã được sử dụng:
#define BOOL int
// primary template
template< class TargetT, class SourceT >
struct boolean_converter;
// full specialization
template< >
struct boolean_converter<bool, BOOL>
{
static bool convert(BOOL b)
{
return b ? true : false;
}
};
// Type your code here, or load an example.
template< class TargetT, class SourceT >
TargetT boolean_cast(SourceT b)
{
typedef boolean_converter<TargetT, SourceT> converter_t;
return converter_t::convert(b);
}
bool is_non_zero(int x) {
return boolean_cast<bool>(x);
}
Tôi đoán câu hỏi là tại sao trước đây không gây ra một C4800 hoặc kể từ khi thậm chí là "Đúc các biểu thức để gõ bool sẽ không vô hiệu hóa các cảnh báo, đó là bởi thiết kế. " (MS) – Tobias
um, điều này thực sự có vị trí của nó ... mọi người đang bối rối C++ và C –
Sau khi phủ định kép, giá trị được đảm bảo là 0 hoặc 1; giá trị ban đầu có thể là bất kỳ giá trị int nào. –