Có thể và/hoặc hữu ích để xác định operator "" (...)
làm chức năng kết bạn không?C++ 0x, các chữ cái do người dùng xác định với toán tử bạn ""()
class Puzzle {
friend Puzzle operator "" _puzzle(const char*, size_t);
...
};
void solve(Puzzle);
int main() {
solve("oxo,xox"_puzzle);
};
Tôi đang nghĩ về "hữu ích" đặc biệt, vì các quy tắc mà operator ""
được định nghĩa trong một namespace chỉ - không phải là ít nhất vì định bắt đầu với _
được dành riêng trong không gian tên toàn cầu. Đây có phải là friend
vi phạm quy tắc này tại đây không? Vì vậy, sẽ không có lợi ích gì với việc đóng gói không hoàn toàn này, đúng không?
Tôi thực sự nghĩ rằng tôi đã đọc nó ở đâu đó, mà hậu tố * nên * chỉ được khai báo bên trong một ** không gian tên **. Tôi không thể nhớ ở đâu - nhưng đó chỉ là một gợi ý, không phải là một yêu cầu. Và do đó, nó có lẽ là một mẹo duy nhất cho "thực hành tốt". Điểm tốt về chức năng người bạn ** mẫu **. Đây không phải là vấn đề với mẫu * friend * thông thường, ít nhất một trong các đối số cho hàm friend là một cá thể lớp - sau đó không có vấn đề đặt tên. – towi
Tôi nhớ nhìn thấy một cái gì đó như thế này trong các giấy tờ vị trí trước đó. Hãy thử n2378.pdf phần 5: Một thành ngữ. Ở đây họ nói: 1. Các chức năng này không được tìm thấy thông qua ADL khi được gọi thông qua các chữ thay vì biểu mẫu toán tử rõ ràng. 2. Điều này sẽ cám dỗ vị trí trong toàn cầu. 3. Điều này sẽ dẫn đến xung đột ngay cả trong mã mà không sử dụng chữ. 4. Vì vậy, đặt các ops chữ trong một không gian tên và đặt một chỉ thị sử dụng để kéo chúng đến mức toàn cầu. – emsr
Tôi chỉ muốn lưu ý rằng bạn có thể * không * sử dụng chức năng bạn bè riêng tư bên trong lớp học, xem [câu hỏi này] (http://stackoverflow.com/questions/8207633/whats-the-scope-of-inline-friend -chức năng). – Xeo