2017-11-13 20 views
6

Chương trình này được biên soạn bởi kêu vang:kêu vang: initialising một tài liệu tham khảo khóa từ một mutex

#include <mutex> 

int main() { 
    std::mutex mtx; 
    const std::lock_guard<std::mutex>& lock(mtx); 
    return 0; 
} 

trình biên dịch lớn khác từ chối nó (Tôi đã thử gcc, MSVC, và icc). Đây là thông báo lỗi từ gcc:

error: invalid initialization of reference of type ‘const 
     std::lock_guard<std::mutex>&’ from expression of type ‘std::mutex’ 

Các lỗi khác tương tự.

Nhang phải hay sai? Điều này có thể được sao chép với một ví dụ đơn giản hơn không liên quan đến các lớp thư viện? Tôi đã thử nhưng vô ích.

Sửa này có vẻ là sinh sản tối thiểu:

struct A {}; 

struct X 
{ 
    explicit X(A&) {}; 
}; 

int main() 
{ 
    A a; 
    const X& x(a); 
} 

Điều thú vị là, một int ở vị trí của A không kích hoạt các thông báo lỗi trong kêu vang (đó là lý do tại sao tôi không thể tái sản xuất này ban đầu).

Trả lời

2

Tôi không có chương và câu phù hợp của tiêu chuẩn C++; Tôi chỉ có thể tham khảo CppReference on Converting Constructors ngay bây giờ (tôi nhấn mạnh):

Một constructor đó là không tuyên bố với sự xác định rõ ràng và có thể được gọi với một tham số duy nhất (cho đến khi C++ 11) được gọi là một chuyển đổi hàm tạo.

Không giống như nhà xây dựng rõ ràng, đó là chỉ coi trong quá trình khởi trực tiếp (bao gồm chuyển đổi rõ ràng như static_cast), nhà thầu chuyển đổi cũng được coi là trong bản khởi tạo, như một phần của chuỗi chuyển đổi người dùng định nghĩa.

Vì vậy:

struct A {}; 

struct X 
{ 
    explicit X(A const &) {}; 
}; 

int main() 
{ 
    A a; 
    const X& x1(A());     // OK, direct init (no A object after init) 
    const X& x3(a);     // NOK, copy init 
} 
+0

Vì vậy, ... là điều này chỉ là một lỗi kêu vang? Có vẻ như vậy cho đôi mắt của tôi ... –

+0

@ n.m .: Tôi không đủ điều kiện để thực hiện * cuộc gọi cụ thể đó. Ở trên chỉ đơn thuần là cách tôi sẽ giải thích thông báo lỗi cho bản thân mình; Tôi sẽ để lại phán quyết cho chính quyền cao hơn ... ;-) – DevSolar

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