我很惊讶地发现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中加入这些特性?有没有一个公认的“正确”版本?
发布于 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++的实现上的表现:
#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';
}
我的输出结果是:
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
https://stackoverflow.com/questions/14483105
复制相似问题