:
multiset<int, greater<int> > ms1;
これはms1
はint
を格納し、タイプstd::greater<int>
の比較ファンクタを使用して、std::multiset
であると述べています。あなたは、コンストラクタの引数を残してきたので、ファンクタのインスタンスは、このようなあなたがstd::greater<int>{}
を通過した正確かのように、1を構築し、デフォルト、次のとおりです。あなたの2番目の例では
multiset<int, greater<int> > ms1(greater<int>{});
:
multiset<int> ms2(greater<int>());
これは少しトリッキーです。ここには2つの問題があります。最初のものは、「最も退屈なパース」と呼ばれるものに関連しています。それは何度も答えられているので、私はそれらの答えの1つに簡単にリンクします。 Most vexing parse: why doesn't A a(()); work?
それでは、あなたがいることを理解すると仮定しましょう、そしてこれに応じて、あなたのコードを変更します。この場合、
multiset<int> ms2(greater<int>{});
// or this
multiset<int> ms2((greater<int>()));
を、あなたは比較ファンクタの種類を残して、デフォルトで行ってきました。デフォルトはstd::less<int>
です。したがって、上記の行がこれに相当します
multiset<int, std::less<int> > ms2(greater<int>{});
何と言うことはms2
がint
を格納し、タイプstd::less<int>
の比較ファンクタを使用して、std::multiset
であるということです。次に、std::greater<int>
のインスタンスをコンストラクタに渡します。 std::less<int>
とstd::greater<int>
は異なるタイプです。一方のインスタンスを、他方のインスタンスを予期している関数に渡すことはできません。
いいえ、同じではありません。あなたは彼らが同じであるという考えを与えたのは何ですか? –
回答はありません[ここ](http://en.cppreference.com/w/cpp/container/multiset)? – user0042
@ user0042:そうではありません。この質問は、テンプレート引数と関数/コンストラクタ引数の違いについての理解の欠如に関するものです。これはコア言語の問題です。これは本当に 'std :: multiset'ではなく、この誤解が明らかになったときに遊んでいたおもちゃです。 –