次のコードは、G上の罰金コンパイル++(さまざまなバージョン)が、打ち鳴らす++に失敗した - 私のシステム上++のlibcと3.4:ファイルが含まれ、実際std :: mapのデフォルトコンストラクタは明示的ですか?
x.cpp:6:12: error: chosen constructor is explicit in copy-initialization
return {};
^~
/usr/local/Cellar/llvm34/3.4.2/lib/llvm-3.4/bin/../include/c++/v1/map:838:14: note: constructor declared here
explicit map(const key_compare& __comp = key_compare())
^
:
#include <map>
#include <string>
std::map<std::string, std::string> f() {
return {};
}
int main() {
auto m = f();
}
打ち鳴らすには、次のような問題をマークコンストラクタをexplicit
と宣言します。 しかし、私のC++ 11ドラフト標準ではそのようにマークされていません。これはclang ++/libC++のバグですか?私は関連するバグレポートを見つけることができませんでした。
に見えます:http://en.cppreference.com/w/cpp/container/map/map –
現行の作業草案[n4659](http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2017/n4659.pdf#subsubsection.26.4.4.1)では、「明示的」とマークされています'。 –
@KonradRudolphあなたの例とエラーメッセージでは、コピーコンストラクタを呼び出すのではなく、問題はその前に - デフォルトの 'std :: map'を作成しようとしているときです。 –