Một toán tử ép kiểu có thể rõ ràng không?


84

Khi nói đến các hàm tạo, việc thêm từ khóa explicitngăn trình biên dịch nhiệt tình tạo một đối tượng khi đó không phải là ý định đầu tiên của lập trình viên. Cơ chế như vậy có sẵn cho các toán tử đúc không?

struct Foo
{
    operator std::string() const;
};

Ví dụ ở đây, tôi muốn có thể cast Foothành một std::string, nhưng tôi không muốn việc cast như vậy xảy ra một cách ngầm định.

Câu trả lời:


101

Có và không.

Nó phụ thuộc vào phiên bản C ++ mà bạn đang sử dụng.

  • C ++ 98 và C ++ 03 không hỗ trợ explicittoán tử chuyển đổi kiểu
  • Nhưng C ++ 11 thì có.

Thí dụ,

struct A
{
    //implicit conversion to int
    operator int() { return 100; }

    //explicit conversion to std::string
    explicit operator std::string() { return "explicit"; } 
};

int main() 
{
   A a;
   int i = a;  //ok - implicit conversion 
   std::string s = a; //error - requires explicit conversion 
}

Biên dịch nó với g++ -std=c++0x, bạn sẽ gặp lỗi này:

prog.cpp: 13: 20: error: chuyển đổi từ 'A' sang loại không vô hướng 'std :: string' được yêu cầu

Bản demo trực tuyến: http://ideone.com/DJut1

Nhưng ngay sau khi bạn viết:

std::string s = static_cast<std::string>(a); //ok - explicit conversion 

Lỗi sẽ biến mất: http://ideone.com/LhuFd

BTW, trong C ++ 11, toán tử chuyển đổi rõ ràng được gọi là "toán tử chuyển đổi theo ngữ cảnh" nếu nó chuyển đổi thành boolean . Ngoài ra, nếu bạn muốn biết thêm về các chuyển đổi ẩn và rõ ràng, hãy đọc chủ đề này:

Hy vọng rằng sẽ giúp.


9
Ngay cả trong C ++ 03, thật dễ dàng để tránh chuyển đổi ngầm. Chỉ cần gọi hàm toString, thay vì gọi operator std::string. Tất nhiên, điều này có thể gây ra sự cố với một số mẫu. Tôi đã luôn sử dụng toStringvà nó chưa bao giờ gây ra bất kỳ vấn đề nào cho tôi, nhưng tôi tưởng tượng rằng điều này có thể phụ thuộc vào phong cách viết mã của bạn.
James Kanze

@MatthieuM. Cũng giống như operator std::string():-).
James Kanze

2
Tôi sử dụng to_stringthay thế. Nó hữu ích rằng đó là những gì C ++ 11 gọi nó, vì vậy nó giúp viết mã tương thích chuyển tiếp nó giúp với các mẫu.
Luis Machuca

1
std::string s(a)hoặc std::string s{a}cũng nên hoạt động như static_cast<std::string>(a).
alfC

2
@Bin: Vì explicit operator bool() nó được trình biên dịch gọi theo ngữ cảnh khi bạn viết if(std::cin). Lưu ý rằng chuyển đổi xảy ra ở đây (không chính thức) được gọi là chuyển đổi theo ngữ cảnh , không phải là chuyển đổi ngầm định .
Nawaz
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.