acm*_*acm 19 c++ standards template-meta-programming c++11 libc++
我很惊讶地发现is_swappable<T>并且is_nothrow_swappable<T>不属于新的C++ 11 type_traits元函数.它们对于传播noexcept模板和确定是否可以为模板实现非抛出交换非常有用.
的libc ++推出其自己的内部版本:看__is_swappable和__is_nothrow_swappable在其版本type_traits的,它使大量的内部使用它们,但不会让他们提供给外部.
我最终将我自己的这些版本拼凑起来用于个人项目,这似乎有效,但我确定它会以某种方式破坏.
我很好奇这两个缺席,因为它们看起来非常重要.在C++ 11标准化过程中是否考虑过此功能,还是仅仅是一个未包含在内的疏忽?如果考虑到了什么,导致它没有被纳入最终标准(缺乏时间,实施问题等)?是否有缺陷报告或进化论文讨论这个问题?有没有计划在C++ 1Y中加入这些特性?某处有一个公认的"正确"版本吗?
How*_*ant 14
is_swappable<T>并且is_nothrow_swappable<T>从未被提议用于C++ 11.这是他们不在C++ 11中的主要原因.也就是说没有被提议就没有任何进展.
那么为什么不提出这些呢?
从个人经验来看,我没有提出任何我没有实施并发现有用的内容.虽然我确实为libc ++实现了它们,但在C++ 11发布之前我没有这样做.我只是没有时间和工具来为C++ 11这样做.我最好的猜测是,任何其他人都是如此.
很高兴你发现这些很有用. 您可以成为下一个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';
}
Run Code Online (Sandbox Code Playgroud)
哪个对我输出:
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
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1274 次 |
| 最近记录: |