gpt4 book ai didi

c++ - 为什么这里的大括号和圆括号初始化之间存在差异?

转载 作者:行者123 更新时间:2023-12-01 19:22:57 31 4
gpt4 key购买 nike

我正在尝试从 this article 重新创建一个简单的示例使用常见的“重载 lambda”技巧来创建可与 std::visit 或其他类似工具一起使用的重载集。我的简化示例是:

#include <iostream>
#include <vector>

template<class... Ts> struct overloaded : Ts... { using Ts::operator()...; }; // (1)
template<class... Ts> overloaded(Ts...) -> overloaded<Ts...>; // (2)

int main() {

overloaded os(
[](int i) { std::cout << "int: " << i << std::endl; },
[](const char *str) { std::cout << "str: " << str << std::endl; }
);

os(1);
os("Hello world!");

return 0;
}

This does not compile

<source>: In function 'int main()':
<source>:12:5: error: no matching function for call to 'overloaded<main()::<lambda(int)>, main()::<lambda(const char*)> >::overloaded(main()::<lambda(int)>, main()::<lambda(const char*)>)'
12 | );
| ^
<source>:4:30: note: candidate: 'constexpr overloaded<main()::<lambda(int)>, main()::<lambda(const char*)> >::overloaded(const overloaded<main()::<lambda(int)>, main()::<lambda(const char*)> >&)'
4 | template<class... Ts> struct overloaded : Ts... { using Ts::operator()...; }; // (1)
| ^~~~~~~~~~
<source>:4:30: note: candidate expects 1 argument, 2 provided
<source>:4:30: note: candidate: 'constexpr overloaded<main()::<lambda(int)>, main()::<lambda(const char*)> >::overloaded(overloaded<main()::<lambda(int)>, main()::<lambda(const char*)> >&&)'
<source>:4:30: note: candidate expects 1 argument, 2 provided

如果我将重载操作系统的初始化更改为使用大括号初始化,then it works 。谁能解释一下这里的区别吗?

最佳答案

这是一个简化的示例,没有任何模板需要处理:

struct A { };
struct B { };

struct C : A, B { };

C x(A{}, B{}); // error
C y{A{}, B{}}; // ok

问题是:C 是一个聚合,因此您可以使用聚合初始化来初始化其组件。这就是 y 起作用的原因。但C 是一个聚合体,它没有构造函数,而这正是x 的初始化试图做的事情。没有这样的匹配构造函数,因此它失败。请注意,在 C++20 中,x 也可以工作,因为我们将能够使用括号执行聚合初始化。

x的声明进行编译的方法是添加一个构造函数:

struct C : A, B {
C(A a, B b) : A(a), B(b) { }
};

或者,对于原来的问题:

template<class... Ts>
struct overloaded : Ts... {
overloaded(Ts... ts) : Ts(std::move(ts))... { } // <==
using Ts::operator()...;
};

或者只是坚持聚合初始化,因为这是我们在这里所做的更明确的事情。

关于c++ - 为什么这里的大括号和圆括号初始化之间存在差异?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59725083/

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