首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >为什么C++11中不包括is_swappable和is_nothrow_swappable?

为什么C++11中不包括is_swappable和is_nothrow_swappable?
EN

Stack Overflow用户
提问于 2013-01-23 23:23:41
回答 1查看 1.6K关注 0票数 19

我很惊讶地发现is_swappable<T>is_nothrow_swappable<T>不在新的C++11 type_traits元函数中。它们对于传播模板的noexcept和确定是否可以实现模板的非抛出交换非常有用。

libc++推出了自己的内部版本:参见its version of type_traits中的__is_swappable和__is_nothrow_swappable,它在内部广泛使用它们,但不使它们在库之外可用。

我最终为一个个人项目拼凑了my own version of these,它看起来很好用,但我确定它不知何故坏了。

我对这两个人的缺席感到好奇,因为他们似乎很重要。这个特性是在C++11标准化过程中被考虑的,还是仅仅是一个疏忽,没有被包括在内?如果它被考虑了,是什么导致它没有被纳入到最终的标准中(缺乏时间,实现问题等)?是否有缺陷报告或进化论文讨论这一点?有没有计划在C++1Y中加入这些特性?有没有一个公认的“正确”版本?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-01-24 00:05:58

is_swappable<T>is_nothrow_swappable<T>从来没有被提议用于C++11。这是他们不在C++11中的主要原因。也就是说,没有任何东西是不被提议的。

那么为什么没有提出这些建议呢?

从个人经验来看,我不会提出任何我还没有实现并发现有用的东西。虽然我确实为libc++实现了它们,但在C++11发布之前我并没有这样做。我根本没有时间和工具为C++11这样做,我最好的猜测是其他任何人都是这样的。

很高兴你发现这些很有用。You可能是为下一个C++标准提出它们的人!我是认真的!我们需要你帮助!

更新

对以下问题的回应:

这有点麻烦,因为它只有在交换是通过移动构造函数和赋值操作符实现的情况下才起作用

下面的测试显示了它在libc++的实现上的表现:

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

struct A
{
    A(const A&);
};

struct B
{
};

void swap(B&, B&);

struct C
{
};

void swap(C&, C&) noexcept;

struct D
{
    D(const D&) noexcept;
    D& operator=(const D&) noexcept;
};

int main()
{
    std::cout << "std::__is_nothrow_swappable<int>::value = "
              << std::__is_nothrow_swappable<int>::value << '\n';
    std::cout << "std::__is_nothrow_swappable<A>::value = "
              << std::__is_nothrow_swappable<A>::value << '\n';
    std::cout << "std::__is_nothrow_swappable<B>::value = "
              << std::__is_nothrow_swappable<B>::value << '\n';
    std::cout << "std::__is_nothrow_swappable<C>::value = "
              << std::__is_nothrow_swappable<C>::value << '\n';
    std::cout << "std::__is_nothrow_swappable<D>::value = "
              << std::__is_nothrow_swappable<D>::value << '\n';
}

我的输出结果是:

代码语言:javascript
复制
std::__is_nothrow_swappable<int>::value = 1
std::__is_nothrow_swappable<A>::value = 0
std::__is_nothrow_swappable<B>::value = 0
std::__is_nothrow_swappable<C>::value = 1
std::__is_nothrow_swappable<D>::value = 1
票数 14
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/14483105

复制
相关文章

相似问题

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