2015-01-14 18 views
10

Tôi có một số mã hoạt động theo GCC nhưng không biên dịch theo Visual Studio 2015 (mà tôi nhận thấy là đang phát triển nhưng khu vực này tôi nghĩ rằng là phải được thực hiện).Có phải trình biên dịch hay chỉ tôi: Kế thừa từ mẫu variadic bao gồm lambdas

template< typename... T > 
class inherit : public T... 
{ 
public: 
inherit(T... t) : T(t)... {} 
}; 

int main() { 
    auto l1 = []() {}; 
    auto l2 = []() {}; 
    inherit<decltype(l1), decltype(l2)> test(l1, l2); 
    return 0; 
} 

Đó là đoạn mã giảm xuống còn bản chất tinh khiết của nó. Visual Studio nói "lỗi cú pháp: 'type'" trên hàm tạo của kế thừa. Sau đó, nó tìm ra một dấu vết nhỏ về cách nó đến đó và kết luận với "bạn không thể xây dựng một thể hiện của một lambda".

Giả định của tôi là việc mở rộng T (t) ... không mở rộng chính xác. Tuy nhiên tôi cũng có thể nhận được cú pháp sai.

EDIT: Xin lỗi câu hỏi là: Tôi có gặp lỗi ở đây hay không? Nếu vậy, cú pháp chính xác là gì?

TÌM KIẾM BỔ SUNG: Để phù hợp với các câu trả lời tôi có, điều này dường như là một vấn đề với Visual Studio 2015 có lỗi trong khu vực này. Trong thử nghiệm nó có vẻ là sự mở rộng của nó, nơi các tham số constructor được truyền cho các lớp cơ sở lambda đang gặp vấn đề. Các thử nghiệm sau đây làm việc dưới VS2015:

template< typename T1, typename T2, typename... T3 > 
class inherit2 : public T3... 
{ 
public: 
    inherit2(T1 t1, T2 t2) : T1(t1), T2(t2) {} 
}; 

int main() { 
    auto l1 = []() {}; 
    auto l2 = []() {}; 
    inherit2<decltype(l1), decltype(l2), decltype(l1), decltype(l2)> test(l1, l2); 
    return 0; 
} 
+2

Có vẻ ổn, clang ++ cũng chấp nhận nó. Điều gì sẽ xảy ra khi bạn loại bỏ các variadicness, nhưng để lại lambdas trong? – dyp

+0

Tôi nghĩ rằng Visual Studio có một vấn đề khi bạn vượt qua một lambda trong một số trường hợp https://connect.microsoft.com/VisualStudio/feedback/details/727957/vc11-beta-compiler-fails-to-compile-lambda-key- comparer-for-maps-and-sets http://stackoverflow.com/questions/25777396/passing-my-compar-function-to-stdmultiset-with-c11/25777512#comment43645224_25777512 – AndyG

+3

Mã của bạn đã được hỗ trợ kể từ gcc 4.6 và clang 3.1 (cả hai từ đầu năm 2012). Visual C++ đang chạy sau 3 năm. – TemplateRex

Trả lời

0

Đó là trình biên dịch. A more recent MSVC, v. 19.00.23106.0 từ tháng 7 năm 2015, chấp nhận ví dụ của bạn.

Cú pháp khởi tạo cú đúp có thể T{t}... sẽ hữu ích. Tôi không thể tìm thấy một trình biên dịch trực tuyến phù hợp để thử, mặc dù.

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