Der folgende CodeMögliche Regression in G ++ 6.1.0
#include <string>
#include <map>
#include <cassert>
struct AV {
explicit AV(std::string const&) {}
};
#if 1
static void check_cache_item(
std::map<std::string, std::string> const& items) // FIXME remove
{
assert(!items.empty());
}
#endif
static void check_cache_item(
std::map<std::string, AV> const& items)
{
assert(!items.empty());
}
int main()
{
check_cache_item({ { "id", "0" }, { "pk", "#0" } });
check_cache_item({ { "id", "0" }, { "pk", "#1" } });
check_cache_item({ { "id", AV{"0"} }, { "pk", AV{"#1"} } });
}
durch g angenommen wird ++ 4.8.4, 5.3.0 g ++, klappern ++ 3.9.0; aber g ++ 6.1.0 gibt einen Fehler:
cci.cc: In function ‘int main()’:
cci.cc:25:55: error: call of overloaded ‘check_cache_item(<brace-enclosed initializer list>)’ is ambiguous
check_cache_item({ { "id", "0" }, { "pk", "#0" } });
^
cci.cc:10:17: note: candidate: void check_cache_item(const std::map<std::__cxx11::basic_string<char>, std::__cxx11::basic_string<char> >&)
static void check_cache_item(
^~~~~~~~~~~~~~~~
cci.cc:16:17: note: candidate: void check_cache_item(const std::map<std::__cxx11::basic_string<char>, AV>&)
static void check_cache_item(
^~~~~~~~~~~~~~~~
cci.cc:26:55: error: call of overloaded ‘check_cache_item(<brace-enclosed initializer list>)’ is ambiguous
check_cache_item({ { "id", "0" }, { "pk", "#1" } });
^
cci.cc:10:17: note: candidate: void check_cache_item(const std::map<std::__cxx11::basic_string<char>, std::__cxx11::basic_string<char> >&)
static void check_cache_item(
^~~~~~~~~~~~~~~~
cci.cc:16:17: note: candidate: void check_cache_item(const std::map<std::__cxx11::basic_string<char>, AV>&)
static void check_cache_item(
^~~~~~~~~~~~~~~~
cci.cc: At global scope:
cci.cc:10:17: warning: ‘void check_cache_item(const std::map<std::__cxx11::basic_string<char>, std::__cxx11::basic_string<char> >&)’ defined but not used [-Wunused-function]
static void check_cache_item(
^~~~~~~~~~~~~~~~
Wenn ich den ersten Konstruktor #IFDEF, dann jeder Compiler einen Fehler wirft (zu Recht, da der AV-Konstruktor explizit).
Ist das eine Regression in G ++ 6.1.0?
[Online Repro Beispiel] (http://melpon.org/wandbox/permlink/0Z1d2KR6anWldz7o) –
G ++ 7 (Stamm) berichtet, auch ein Fehler – Bulletmagnet