dpj*_*dpj 17 c++ clang shared-ptr initializer-list c++11
std :: shared_ptr构造函数的行为不符合我的预期:
#include <iostream>
#include <vector>
void func(std::vector<std::string> strings)
{
for (auto const& string : strings)
{
std::cout << string << '\n';
}
}
struct Func
{
Func(std::vector<std::string> strings)
{
for (auto& string : strings)
{
std::cout << string << '\n';
}
}
};
int main(int argc, const char * argv[])
{
func({"foo", "bar", "baz"});
Func({"foo", "bar", "baz"});
//auto ptr = std::make_shared<Func>({"foo", "bar", "baz"}); // won't compile.
//auto ptr = std::make_shared<Func>{"foo", "bar", "baz"}; // nor this.
return 0;
}
Run Code Online (Sandbox Code Playgroud)
我做错了什么还是编译器?编译器是:
$ clang ++ --version Apple clang 4.0版(标签/ Apple/clang-421.0.57)(基于LLVM 3.1svn)
编辑:shared_ptr而不是make_shared.
这是错误:
make -k
clang++ -std=c++11 -stdlib=libc++ main.cc -o main
main.cc:28:18: error: no matching function for call to 'make_shared'
auto ptr = std::make_shared<Func>({"foo", "bar", "baz"});
^~~~~~~~~~~~~~~~~~~~~~
/usr/bin/../lib/c++/v1/memory:4621:1: note: candidate function not viable:
requires 0 arguments, but 1 was provided
make_shared(_Args&& ...__args)
^
1 error generated.
Run Code Online (Sandbox Code Playgroud)
How*_*ant 24
试试这个:
auto ptr = std::make_shared<Func>(std::initializer_list<std::string>{"foo", "bar", "baz"});
Run Code Online (Sandbox Code Playgroud)
Clang不愿意推断出那种类型{"foo", "bar", "baz"}.我目前还不确定这是该语言的工作方式,还是我们正在查看编译器错误.
构造函数shared_ptr<T>将类型的指针T*作为其参数,假定指向动态分配的资源(或者至少可以由删除器释放的东西).另一方面,make_shared为您构造并直接获取构造函数参数.
所以要么你这样说:
std::shared_ptr<Foo> p(new Foo('a', true, Blue));
Run Code Online (Sandbox Code Playgroud)
或者,更好,更有效:
auto p = std::make_shared<Foo>('a', true, Blue);
Run Code Online (Sandbox Code Playgroud)
后一种形式负责为您分配和构建,并在此过程中创建更有效的实现.
你当然也可以说make_shared<Foo>(Foo('a', true, Blue)),但这只会创建一个不必要的副本(可能会被省略),更重要的是它会产生不必要的冗余.[ 编辑 ]要初始化矢量,这可能是最好的方法:
auto p = std::make_shared<Func>(std::vector<std::string>({"a", "b", "c"}));
Run Code Online (Sandbox Code Playgroud)
但重要的是,为您make_shared 执行动态分配,而shared-ptr构造函数则没有,而是取得所有权.
| 归档时间: |
|
| 查看次数: |
15329 次 |
| 最近记录: |