Trong khi chơi với các mẫu variadic, các lớp học, chức năng và lambdas, (from here) tôi thấy rằng đoạn mã sau đang chạy với clang++
khi không chạy với g++
:variadic mẫu sử dụng lambdas: lỗi với g ++ nhưng chạy với kêu vang ++
#include <iostream>
#include <string>
using namespace std;
template <class... F>
struct overload_set : F...
{
overload_set(F... f) : F(f)... {}
};
template <class... F>
auto overload(F... f)
{
return overload_set<F...>(f...);
}
int main()
{
auto func = overload (
[](int &val) { val *= 2; },
[](string &arg) { arg += arg; },
[](char &c) { c = 'x'; }
);
int val = 10;
string str = "stackoverflow";
char ch = 's';
cout << val << " : " << str << " : " << ch << endl;
func(val);
func(str);
func(ch);
cout << val << " : " << str << " : " << ch << endl;
return 0;
}
Đối clang
: coliru
Đối g++
: coliru
g++
đang đưa ra mơ hồ operator()
cho func(val)
, func(str)
và func(c)
. Tôi nghĩ rằng operator()
không được mơ hồ, vì mỗi loại có các đối số khác nhau.
Sự cố với g++
là gì?
@Niall: nó không thực sự về lambdas hoặc thậm chí các mẫu variadic; ngay cả khi 'struct' đơn giản nhất xuất phát từ các cơ sở' B1', 'B2' ... với các hàm' operator() (X &) 'khác, g ++ cần' sử dụng toán tử B1 ::(); sử dụng toán tử B2 ::(); '(xem [ở đây] (http://coliru.stacked-crooked.com/a/8bc933418b5ff82f)). –
@TonyD. Tôi nghĩ rằng nó là một lỗi clang - một số thử nghiệm cho thấy có một sự khác biệt ở đây trong cách clang giải quyết các chức năng từ các lớp cơ sở so với cách nó giải quyết toán tử cuộc gọi. – Niall
@Niall gotcha, clang giải quyết 'x()' khác với 'x.operator()()'. –