C++ 为什么C+中不包括可交换和不可交换+;11?

C++ 为什么C+中不包括可交换和不可交换+;11?,c++,c++11,standards,template-meta-programming,libc++,C++,C++11,Standards,Template Meta Programming,Libc++,我惊讶地发现,是可交换的和是可交换的不在新的C++11类型的元函数中。它们对于为模板传播noexcept,以及确定是否可以为模板实现非抛出交换非常有用 libc++推出了自己的内部版本:see _是可交换的和_是可交换的,它在内部广泛使用它们,但不使它们在库外可用 我最终拼凑了一个私人项目,看起来很有效,但我确信它不知何故被破坏了 我很好奇这两个人的缺席,因为他们似乎很重要。这个特性是在C++11标准化过程中考虑的,还是仅仅因为疏忽而没有包括在内?如果考虑了,是什么导致它没有被纳入最终标准(缺乏

我惊讶地发现,
是可交换的
是可交换的
不在新的C++11类型的元函数中。它们对于为模板传播
noexcept
,以及确定是否可以为模板实现非抛出交换非常有用

libc++推出了自己的内部版本:see _是可交换的和_是可交换的,它在内部广泛使用它们,但不使它们在库外可用

我最终拼凑了一个私人项目,看起来很有效,但我确信它不知何故被破坏了

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

是可交换的
不是可交换的
从未为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';
}
#包括
#包括
结构A
{
A(常数A&);
};
结构B
{
};
无效掉期(B&,B&);
结构C
{
};
无效掉期(C&,C&)无例外;
结构D
{
D(常数D&)无例外;
D&运算符=(const D&)noexcept;
};
int main()
{

std::可能只是吹毛求疵,但这应该是“可交换”的要求吗那
swap
return void?我想不出任何其他合理的方法让它返回。我想帮你:如果你确定你的代码是错误的,我可以发现一些无关紧要的缺陷,那么它就不必有重大缺陷;-)很好的问题,我真的不知道。这种微妙之处正是我批评它的原因这是个好问题,但有一点需要记住,
noexcept
可以用作类似于
decltype
的关键字来传播异常规范。例如,固定大小数组的
std::swap
重载有一个异常规范
noexcept(noexcept(swap(*a,*b)))
,这意味着如果单个元素的交换是noexcept,那么它就是noexcept。@DaveS的观点很好,但我担心它如何与参数相关的查找交互?因为在实现任何具有noexcept表达式的函数时,我几乎肯定会说
使用std swap;swap(a,b)
这样,如果ADL交换可用,我将得到它;如果没有,我将得到
std::swap
。但是我看不到在
noexcept
表达式中实现相同效果的方法,这意味着测试和代码可能不匹配。@acm:我同意如果它更漂亮会更好,但解决方案是移动底层函数在名称空间中添加一个using子句。请参阅,感谢您的解释。我也这么怀疑,但希望在投入更多时间之前确保它们不会被“因故拒绝”。编写添加这些内容的建议听起来非常有趣。因为mod删除Beman Dawes的注释回答忘记添加他的nev作为一个恰当的评论,我将重复这里,引用他说:“如果你想按照霍华德的建议,提出下一个C++标准的ISHSWAP和IsNojOffice,请参阅如何着手。你也可以请求帮助或要求别人审查你的建议。”根据你的建议,我已经开始研究这样一个建议:(来源于此:)并加入了Beman链接到的std提案组,这是一本很吸引人的书。我希望在将我的草案发送给该组之前,有一些朋友帮助我审阅。由于这是我第一次尝试这样的事情,所有的反馈、评论、批评等都非常受欢迎,因为我希望我发送给该组的内容都能在至少有点抛光。祝贺它进入C++17。我很高兴我们现在有这个功能!我需要一个只使用C++11的实现。有人能发布它吗?
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