2012-11-09 31 views
5

Tôi có một câu hỏi về một tình huống mà tôi vừa đến khi làm việc.Làm rõ về tra cứu tên C++

thiết lập: trong stringStuff.h

namespace n1 
{ 
namespace n2 
{ 
    typedef std::string myString; 
} 
} 

namespace n1 
{ 
namespace n2 
{ 
    void LTrim(myString& io_string); 
    void RTrim(myString& io_string); 

    inline void Trim(myString& io_string) 
    { 
     LTrim(io_string); 
     RTrim(io_string); 
    } 
} 
} 

trong impl.cpp

#include "stringStuff.h" // This actually gets included via other include files 
#include "globalInclude.h" // contains 'using namespace n1::n2;'. Yes, I know this isn't best practice 

inline static myString Trim(const myString& in_string) 
{ 
    // impl 
} 

static void impl(const myString& in_string, myString& out_string) 
{ 
    size_t N = 10; // just some computed value. 
    out_string = Trim(in_string.substr(1, N)); // This is the line with the error 
} 

bây giờ, tôi thừa nhận tôi không hiểu quy tắc phân giải tên C++ khá cũng như tôi cần, nhưng khi tôi xem xét điều này, có vẻ như cuộc gọi tới Trim nên không rõ ràng.

Điều đáng ngạc nhiên là nó biên dịch tốt trên Linux bằng GCC, gọi hàm được định nghĩa trong impl.cpp. Khi tôi biên dịch trên HP-UX sử dụng trình biên dịch gốc của nó, có vẻ như giải quyết cuộc gọi như là một định nghĩa trong stringStuff.h, và than phiền về việc chuyển đổi tạm thời thành một tham số không const (đây là một cảnh báo đáng ngạc nhiên, không phải lỗi) và cố gắng gán khoảng trống cho myString.

Điều gì sẽ xảy ra theo tiêu chuẩn C++ và trình biên dịch nào (nếu một trong hai) là đúng?

BTW, tôi 'cố định' trong trường hợp của tôi bằng cách đặt trước cuộc gọi để cắt bằng ::, mặc dù điều đó không thực sự lý tưởng.

Trả lời

2

Bí quyết là một tham chiếu const và tham chiếu khác không phải const, do đó, chúng là hai hàm khác nhau, không phải cùng một hàm có độ phân giải có thể mơ hồ. Sau đó nó đi xuống đến loại tham số trong cuộc gọi. Vì substr trả về một giá trị, nó chỉ có thể liên kết với tham chiếu const. Vì vậy, nó nên gọi ::Trim mà không có cảnh báo. Tôi sẽ nói rằng trình biên dịch HP-UX là sai.

+0

Vì vậy, bạn có thể quá tải trên const-ness của tham số? Tôi không biết điều đó. – Bwmat

+1

@Bwmat Chúng được coi là các dẫn xuất khác nhau cùng loại, do đó các loại hậu quả khác nhau, và do đó đủ điều kiện cho chứng nhận chữ ký cho quá tải. – WhozCraig