Gần đây tôi đã vấp phải một điều gì đó lạ: chuyển đổi boolean thành con trỏ hoạt động trong Visual Studio 2013 và 2015 nhưng không phải trên GCC cũng như Clang (đã thử trong 3.5).Chuyển đổi một bool (false) thành con trỏ hợp pháp trong C++?
#include <iostream>
using namespace std;
void foo(int *ptr)
{
std::cout << "foo";
}
int main()
{
foo(false);
}
Lỗi trong GCC:
main.cpp: In function 'int main()':
main.cpp:13:13: error: cannot convert 'bool' to 'int*' for argument '1' to 'void foo(int*)'
foo(false);
^
tôi đoán là sai được chuyển thành 0 tương đương với NULL. Thay thế cuộc gọi thành foo với foo(true)
làm cho quá trình biên dịch thất bại với mọi trình biên dịch.
Vì vậy, câu hỏi của tôi là: mã này có được biên dịch không? Tôi không thấy lợi ích của việc chuyển đổi giả thành con trỏ, có vẻ như tôi sẽ chỉ là nguyên nhân của lỗi sau khi lạm dụng/tái cấu trúc v.v.
liên quan: [Ngăn cast im lặng từ false thành con trỏ] (http://stackoverflow.com/q/21025179/3425536) – emlai
@ DieterLücking Tôi không nghĩ rằng đó là trùng lặp, OP muốn biết là nó cho phép và mà trình biên dịch (gcc, clang, vc) là chính xác. – songyuanyao
Chết tiệt, tôi đã tìm kiếm và không tìm thấy bất kỳ nội dung nào có liên quan. Nó có hợp lệ C++ không? Và nếu vậy, tại sao lỗi clang khi biên dịch nó? Nó là một lỗi trình biên dịch hay nó không thực sự được định nghĩa trong tiêu chuẩn? – Uflex