gpt4 book ai didi

c++ - gcc vs clang - 使用 `make_overload` 可变 lambda 继承时的模糊重载

转载 作者:太空狗 更新时间:2023-10-29 21:39:20 24 4
gpt4 key购买 nike

<分区>

是时候进行另一轮 clang vs gcc 了。 Live example on godbolt.org .


测试 0:重载的可调用对象

struct Trad
{
auto operator()(int) { return 1; }
auto operator()(float) { return 2; }
auto operator()(double) { return 3; }
};

int main()
{
assert(Trad{}(1) == 1);
assert(Trad{}(1.f) == 2);
assert(Trad{}(1.0) == 3);
}
  • g++ 5.2编译运行。
  • clang++ 3.5 (及以后版本)编译运行。

测试 1:重载的可调用对象,通过 lambda 继承生成

template <typename... TFs>
struct overload_set : TFs...
{
overload_set(TFs... fs) : TFs(fs)... {}
};

template <typename... TFs>
auto overload(TFs&&... fs)
{
return overload_set<TFs...>{fs...};
}

int main()
{
auto func = overload
(
[](int) { return 1; },
[](float) { return 2; },
[](double) { return 3; }
);

assert(func(1) == 1);
assert(func(1.f) == 2);
assert(func(1.0) == 3);
}
  • g++ 5.2 无法编译。

    • error: request for member 'operator()' is ambiguous

  • clang++ 3.5 (及以后版本)编译运行。


这里哪个编译器是正确的?

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com