Phương pháp trong C++ 14 có thể nói cho dù họ đang kêu gọi một L-giá trị hoặc một R có giá trị:Ngăn chặn instantiation L-giá trị trong C++ 14
struct A{
A() { puts("Ctor"); }
void m() const & { puts("L-value"); }
void m() const && { puts("R-value"); }
};
int main(){
A a; //Ctor
a.m() //L-value
A().m(); //Ctor; R-value
}
một ctor thể cho loại nó đang xây dựng? Tôi có thể tắt hoàn toàn việc xây dựng các giá trị L từ lớp học của mình không?
Tôi có một lớp proxy (một số, trên thực tế), nên luôn chuyển đổi thành một thứ khác. Sử dụng nó mà không cần chuyển đổi là một lỗi. Tôi có thể phát hiện lỗi đó trong thời gian chạy, ví dụ: bằng cách thêm bool used_ = 0;
thành viên #ifndef NDEBUG;
và đặt nó trong diễn viên do người dùng chỉ định và sau đó thực hiện assert(used_)
trong lớp proxy Dtor
, tuy nhiên sẽ đẹp hơn nếu tôi có thể truy cập trình biên dịch để ngăn chặn instatiation của L-value
trường hợp của proxy đó ở nơi đầu tiên:
auto x = Proxy().method1().method2(); // no
Proxy p; // no
Target x = Proxy(); //yes
Target x = Proxy().method1().method2(); //yes
Tôi có thể làm điều gì đó tương tự với C++ 14 không?
Cách học cũ để đạt được điều bạn muốn là đặt hàm tạo thành riêng tư và chỉ cho phép xây dựng thông qua các phương thức tĩnh. Tôi nghĩ điều đó cũng trực quan hơn với người làm việc với mã của bạn. – ypnos
'auto && x = Proxy();' không thể ngăn chặn IIRC. Và sau đó 'x' là một Proxy lvalue có thể sửa đổi được. – dyp
Tôi có cảm giác câu trả lời vẫn không có và bạn phải làm những gì ypnos gợi ý – NathanOliver