2011-11-23 29 views
77

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

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

Ở đây, ví dụ, tôi muốn để có thể đúc Foo thành một std::string, nhưng tôi không muốn dàn diễn viên như vậy xảy ra ngầm.

Trả lời

94

Có và không

Tùy thuộc vào phiên bản C++ bạn đang sử dụng.

  • C++ 98 và C++ 03 không hỗ trợ explicit loại nhà khai thác chuyển đổi
  • Nhưng C++ 11 không.

Ví 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ẽ nhận được lỗi này:

prog.cpp:13:20: error: conversion from 'A' to non-scalar type 'std::string' requested

online demo: http://ideone.com/DJut1

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

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

Các lỗi sẽ biến mất: http://ideone.com/LhuFd

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

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

+1

+1. Có thể đăng một ví dụ về mã C++ 11 không? – FailedDev

+1

@FailedDev: Xong. :-) – Nawaz

+1

Cảm ơn rất tốt! – FailedDev

Các vấn đề liên quan