【问题标题】:Does Visual Studio 2012 do this correctly? std::moveVisual Studio 2012 是否正确执行此操作?标准::移动
【发布时间】:2014-01-12 12:21:27
【问题描述】:

我最近尝试回答的一个问题似乎是 vs2012 的 c++11 支持中的错误。

具体来说,尽管只有 std::move 用于插入映射,但它无法使用不可复制构造的 value_type 编译 std::map。要么选择了错误的插入重载,要么编译器没有考虑替代方案。

基本上,我不知道下面的代码:

#include <iostream>
#include <memory>
#include <utility>
#include <type_traits>

class Foo {
};

using namespace std;

int main() {
    cout << is_constructible<pair<const int,unique_ptr<Foo> >, pair<const int,unique_ptr<Foo> >& >::value << '\n';
    cout << is_constructible<pair<const int,unique_ptr<Foo> >, pair<const int,unique_ptr<Foo> >&& >::value << '\n';
}

给出输出 01。

【问题讨论】:

  • 我在 Visual Studio 2013 中使用 std::move 时也遇到了问题
  • @Tips48 这是你的问题!小世界

标签: c++ visual-studio-2012 c++11 compiler-bug


【解决方案1】:

Visual Studio 输出(see it live):

1
1

这显然是错误的,gccclang 都给出了预期的结果。此错误和您看到的原始问题可能与这两个已接受的错误报告有关。 is_constructible 的错误结果实际上可能与original bug 无关:

【讨论】:

  • 抱歉,请稍微澄清一下:原始错误,与其他答案一样吗?
  • 编译器似乎认为它是可复制构造的,只有在生成复制构造函数时才发现它是错误的。我会再添加几个案例,如果没关系编辑我看到你领先一步,谢谢。不过,“原始问题”是什么意思?
  • @user3125280 我指的是this 作为原始问题。
  • 是这样想的——作为参考,我对另一个问题的回答确实有效,(我以前不知道网上有 vc)所以似乎存在关系——vc 错误地认为不可能插入重载,因为它假定存在复制 ctor。其他编译器可以正常工作并且不考虑重载编辑:实际上,它也可以在没有我的回答的情况下工作.. 所以 OP 一定是在做一些奇怪的事情.. 无论如何谢谢
  • @user3125280 这是一个简洁的工具,我有我认为的完整列表here,我会尽量保持最新。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-11-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多