で実行している、(from here)私はg++
で実行ないながら、次のコードは、clang++
で実行されていることがわかった:可変引数テンプレート:グラムとエラー++が、可変引数テンプレート、クラス、関数やラムダで遊んでいる間打ち鳴らす++
g++
についてはcoliru :clang
については
#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;
}
g++
は、func(val)
,func(str)
およびfunc(c)
の場合、あいまいな数字を示しています(operator()
)。私はoperator()
がそれぞれ異なる引数を持っているのであいまいであってはならないと思う。
g++
の問題点を教えてください。
@Niall:それは本当にラムダやバリデーションテンプレートではありません。異なる 'operator()(X&)'関数を持つ 'B1'、' B2' ...から派生する最も単純な 'struct'を与えられても、g ++は' B1 :: operator();を使う必要があります。 B2 :: operator(); 'を使用します([here](http://coliru.stacked-crooked.com/a/8bc933418b5ff82f)参照)。 –
@TonyD。私はそれがclangバグだと思っています - いくつかのテストは、clangが基本クラスから関数を解決する方法と、呼び出し演算子を解決する方法との違いがあることを示しています。 – Niall
@Niall gotcha、clangは 'x()'と 'x.operator()()'を別々に解決します。 –