のstd :: shared_ptrのコンストラクタは、私が期待通りに動作しない:の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;
}
私が何か間違ったことやコンパイラであるだろうか?コンパイラは、次のとおりです。
$打ち鳴らす++ --version アップル打ち鳴らすバージョン4.0(タグ/アップル/打ち鳴らす-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.
最後に私は、完璧な転送は、イニシャライザリストが関係しているときには全く完璧ではないことが知られています。 – Puppy
{"foo"、 "bar"、 "baz"}は式ではないので、タイプはありません(autoと一緒に使用する場合を除いて)。 – Cubbi