6
#include <iostream> 
using namespace std; 

struct Y; 

struct X 
{ 
    X(const Y&) { cout << "converting constructor" << endl; } 
}; 

struct Y 
{ 
    operator X() { cout << "conversion function" << endl; } 
}; 

void f(X x) {} 

int main() 
{ 
    Y y; 
    f(y); 
} 

Ở phía trên chức năng chuyển đổi được ưu tiên cho chuyển đổi constructor bởi trình biên dịch của tôi (gcc 4.6.1), tuy nhiên trong tiêu chuẩn nó nói rằng:C++ 11: Sự mơ hồ giữa hàm chuyển đổi và hàm chuyển đổi khi khởi tạo tham số truyền qua giá trị?

User-defined conversions are applied only where they are unambiguous

Có vẻ như rằng có sự mơ hồ trong trường hợp này. Bất cứ ai có thể giải thích mâu thuẫn?

Tôi đã dự kiến ​​ở trên sẽ không biên dịch. Tôi cũng khá chắc chắn nhiều năm trước rằng Scott Meyers đã viết về ví dụ cụ thể này và nói rằng nó sẽ không biên dịch. Tôi đang thiếu gì?

Trả lời

5

Vì hàm tạo X muốn tham số const, nó thích toán tử. Nếu bạn loại bỏ các const trong X constructor sau đó trình biên dịch phàn nàn về sự mơ hồ. Nếu có nhiều hơn một hàm có tham số tham chiếu, thì có một hàm có trình độ const thoải mái nhất được ưu tiên.

Một câu trả lời tốt here

1

Không có sự nhập nhằng ở đây, việc chuyển đổi chỉ có giá trị được cung cấp bởi các chức năng chuyển đổi .
Lưu ý rằng ykhông phải là một const, constructor chuyển đổi của bạn cần một đối số const.

Sẽ có sự mơ hồ, nếu nhà xây dựng chuyển đổi của bạn lấy tham chiếu không const.

Online Sample:

#include <iostream> 
using namespace std; 

struct Y; 

struct X 
{ 
    X(Y&) { cout << "converting constructor" << endl; } 

}; 

struct Y 
{ 
    operator X() { cout << "conversion function" << endl; } 
}; 

void f(X x) {} 

int main() 
{ 
    Y y; 
    f(y); 
    return 0; 
} 

Output:

prog.cpp: In member function ‘Y::operator X()’:
prog.cpp:13: warning: no return statement in function returning non-void
prog.cpp: In function ‘int main()’:
prog.cpp:21: error: conversion from ‘Y’ to ‘X’ is ambiguous
prog.cpp:13: note: candidates are: Y::operator X()
prog.cpp:8: note: X::X(Y&)

+0

Btw, không có gì C++ 11 cụ thể trong mã sample.The là có giá trị ngay cả trong C++ 03. –

+0

Lý do để bỏ qua điều này là gì? Vui lòng nêu rõ lý do khi bạn downvote để chỉ ra những gì bạn cảm thấy là sai và nếu bạn không thể nghĩ ra bất kỳ lý do hợp lý/kỹ thuật nào để biện minh cho downvote, hãy xem xét bản thân bạn không đủ điều kiện để downvoting. –

+0

tôi xin lỗi. tôi nghĩ rằng lý do tôi downvoted nó đã được đưa ra trong câu trả lời được chấp nhận. constructor * có thể * được sử dụng bởi chuyển đổi. nhưng nó không được ưa thích. –

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