【问题标题】:Are lambda functions nothrow_move_assignable?lambda 函数是 nothrow_move_assignable 吗?
【发布时间】:2016-10-24 16:42:13
【问题描述】:

clang-cl (4.0.0-trunk) 似乎认为是,而 vc2015 (update3) 认为不是。

此实现是否已定义或标准是否规定了 lambda 函数应如何实现?

#include <type_traits>
#include <iostream>

template <typename T>
void test_nothrow_move_assignable(T&&) {
  std::cout << std::boolalpha
    << std::is_nothrow_move_assignable<T>::value
    << "\n";
}

int main() {
  test_nothrow_move_assignable([]{});
  return 0;
}

// $ clang-cl.exe scratch.cpp
// $ scratch.exe
// true

// $ cl /nologo /EHsc scratch.cpp
// scratch.cpp
// $ scratch.exe
// false

【问题讨论】:

  • 我认为闭包类型根本不能移动分配。

标签: c++ lambda typetraits


【解决方案1】:

这是个问题。来自 [expr.prim.lambda]:

lambda-expression 关联的闭包类型没有默认构造函数和 已删除的副本分配 运算符。它有一个默认的复制构造函数和一个默认的移动构造函数 (12.8)。

所以该类型根本不应该是可移动分配的,更不用说不可移动分配了。

【讨论】:

  • 有趣的是,我在您强调之后立即开始阅读该行,同时查看移动设备上的标准,并且完全错过了有关复制构造函数的声明。接得好。 +1
猜你喜欢
  • 1970-01-01
  • 2015-12-09
  • 2012-01-01
  • 1970-01-01
  • 2010-09-06
相关资源
最近更新 更多