以下代码可以使用gcc 4.7.2 (mingw)编译而无误。
#include <unordered_map>
#include <tuple>
struct test
{
test() =default;
private:
test(test const&) =delete;
};
int main()
{
std::unordered_map<char, test> map;
map.emplace(
std::piecewise_construct,
std::forward_as_tuple('a'),
std::forward_as_tuple()
);
}
如果我把test
的拷贝构造函数从test(test const&) =delete;
改为test(test const&) =default;
,然而,模板错误提示好像抱怨const test&
不能转换为test
(文本在这里)。难道两者都可以吗?或者,如果不行,它们两个都应该报错吧?
insert
而不是emplace
。GCC 4.7.2的程序失败的原因是它在模板参数推导过程中没有进行访问检查(这是C++03所要求的),所以is_constructible
由于私有构造函数而出现访问失败。GCC 4.8实现了C++11的规则,并在模板参数推导期间进行了访问检查。 - Jonathan Wakely