首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么is_copy_constructible在MSVC12中为unique_ptr返回true

为什么is_copy_constructible在MSVC12中为unique_ptr返回true
EN

Stack Overflow用户
提问于 2015-12-07 14:01:26
回答 2查看 594关注 0票数 11

我原以为这种静态的断言会引发:

代码语言:javascript
复制
#include <type_traits>
#include <memory>

int main() {
  static_assert(std::is_copy_constructible<std::unique_ptr<int>>::value, "UPtr has copy constructor?");
}

但事实并非如此。

使用MSVC12编译:

微软(R) C/C++优化编译器版本18.00.31101用于x64

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-12-07 14:12:10

static_assert应该触发,ptr有一个隐式删除的复制构造函数,所以这是一个bug。这看起来与这个bug报告可构造性被破坏有关。

(1)对于已删除的复制构造函数类型,std::is_copy_constructible返回true。 (2)对于组成不可复制可构造类型的类型,std::is_copy_constructible返回true。

他们的反应是:

谢谢你报告这个窃听器。我们已经修复了它,该修复程序将在2013年以后的下一个主要版本的Visual中使用。

另外,请参阅这个bug报告:可构造性不能正常工作

注意,断言在使用最新版本的Visual的webcompiler编译器上触发。上一次更新是在Dec 3, 2015上。这一断言还对clang(http://melpon.org/wandbox/permlink/FE8qmjd7wThSUqlZ)和gcc产生了影响。

我发现了一个bug报告:可构造性,它的代码与您的非常相似:

代码语言:javascript
复制
static_assert(std::is_copy_constructible<std::unique_ptr<int>>::value, "");

对此的答复是:

谢谢你报告这个窃听器。我们已经修复了它,并在VS 2015预览版中提供了修复。

不清楚,这是在哪个版本的Visual中修复的。一种反应是2013年底版本,而后者则说是2015年预览版。

票数 15
EN

Stack Overflow用户

发布于 2018-03-04 07:25:24

以下是四种使类不可复制的方法:

代码语言:javascript
复制
#include <stdio.h>
#include <type_traits>

class A {
public:
    A(const A&) = delete;
    void operator=(const A&) = delete;
};

class B {
private:
    B(const B&) = delete;
    void operator=(const B&) = delete;
};

class C {
public:
    C(const C&) = delete;
    void operator=(const C&) = delete;
    void operator=(C) = delete;
};

class D {
private:
    D(const D&) = delete;
    void operator=(const D&) = delete;
    void operator=(D) = delete;
};

int main() {
    printf("%d %d\n", std::is_copy_constructible<A>::value, std::is_copy_assignable<A>::value);
    printf("%d %d\n", std::is_copy_constructible<B>::value, std::is_copy_assignable<B>::value);
    printf("%d %d\n", std::is_copy_constructible<C>::value, std::is_copy_assignable<C>::value);
    printf("%d %d\n", std::is_copy_constructible<D>::value, std::is_copy_assignable<D>::value);
}

在MSVC2013 x64 (18.00.40629 for x64)上,它打印:

代码语言:javascript
复制
1 1    //A
0 1    //B
1 0    //C
0 0    //D

在适当的编译器上,所有八个值都必须是零。

不幸的是,而不是为解决MSVC2013中的bug提供了一种很好的方法,甚至对于您自己的类也是如此。因为如果您根据值声明赋值操作符接受参数,那么您就不能在同一个类中声明移动赋值(任何移动赋值都不会因为不明确的重载而编译)。

P.S.固定作业的关键思想取自这个相关的答案

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/34135409

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档