2017-08-24 30 views
6

Tôi đã gặp sự cố khi cố gắng gọi hàm thành viên bên trong lambda cho một ảnh chụp this. Có một phiên bản const và không const của hàm và nó được tạo kiểu trên một kiểu.Gọi mơ hồ đến chức năng thành viên để ghi hình này trong lambda

Ví dụ dưới đây các lỗi:

struct TEST 
{ 
    template <typename T> 
    void test() {} 

    template <typename T> 
    void test() const {} 

    TEST() 
    { 
    [this]() 
    { 
     test<void>(); 
    }(); 
    } 
}; 

Messages: http://rextester.com/MLU2098

source_file.cpp(13): error C2668: 'TEST::test': ambiguous call to overloaded function 
source_file.cpp(7): note: could be 'void TEST::test<void>(void) const' 
source_file.cpp(4): note: or  'void TEST::test<void>(void)' 
source_file.cpp(13): note: while trying to match the argument list '()' 
Microsoft (R) C/C++ Optimizing Compiler Version 19.00.23506 for x64 

Tôi đã không chắc chắn nếu hành vi này là đúng và chỉ là một vấn đề với trình biên dịch Microsoft, vì vậy tôi đã thử nghiệm mã với gcc và clang trong trình thám hiểm trình biên dịch và cả hai đều biên dịch mã mà không có lỗi.

Trình biên dịch nào đang hiển thị hành vi đúng ở đây?

+2

[Đây là một repro với MSVC] (http://rextester.com/MLU2098) – AndyG

Trả lời

6

Đây là vấn đề với MSVC. Tham số ngụ ý this có trình độ cv. Đó là lý do tại sao quá tải một chức năng thành viên trên một cv-vòng loại là có thể. Trong phần thân của c'tor, this trỏ đến một đối tượng không phải const (khởi tạo nghĩa là chúng ta phải sửa đổi đối tượng sau khi tất cả).

Điều này là đủ để xác định mức quá tải cần gọi.

Vì lý do gì, MSVC bị nhầm lẫn. Nhưng nếu bạn gọi hàm thành viên bằng cách truy cập con trỏ this một cách rõ ràng, sự nhầm lẫn biến mất:

void bar() 
{ 
    [this]() 
    { 
    this->test<void>(); 
    }(); 
} 

Live MSVC Example

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