gpt4 book ai didi

c++ - 为什么 braced-init-list 在函数调用和构造函数调用中的行为不同?

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:19:47 25 4
gpt4 key购买 nike

使用 clang 3.5.0 和 gcc 4.9.1 编译以下代码会在最后一条语句处产生错误。

#include <iostream>

struct Foo { Foo(int x, int y) { std::cout << "Foo(int = " << x << ", int = " << y << ")" << std::endl; } };

void bar(int x, int y) { std::cout << "bar(int = " << x << ", int = " << y << ")" << std::endl; }

int main()
{
Foo({}, {}); // Foo(int = 0, int = 0)
Foo({1}, {2}); // Foo(int = 1, int = 2)
Foo({1, 2}); // Foo(int = 1, int = 2)

bar({}, {}); // bar(int = 0, int = 0)
bar({1}, {2}); // bar(int = 1, int = 2)
bar({1, 2}); // error: no matching function for call to 'bar' <<< Why? <<<
}

为什么 Foo({1, 2}) 可以,而 bar({1, 2}) 不行?

特别是,如果能了解基本原理会很棒。

最佳答案

Foo({1,2}) 创建一个临时 Foo 对象并调用复制构造函数。

请参阅此修改后的带有复制构造函数删除的示例: http://coliru.stacked-crooked.com/a/6cb80746a8479799

它的错误是:

main.cpp:6:5: note: candidate constructor has been explicitly deleted
Foo(const Foo& f) = delete;

关于c++ - 为什么 braced-init-list 在函数调用和构造函数调用中的行为不同?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26806194/

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