std::move(std::array) g++ vs visual-c++
std::move(std::array) g++ vs visual-c++
我在Visual Studio 2013的项目中为我的std::array中的元素实现移动构造函数时遇到了一些问题。
所以我尝试在记事本++中制作一个最小的示例,我用g ++ 5.3.0编译。
只是发现在 g++ 中我可以做我正在尝试的事情
示例 G++:
#include <iostream>
#include <array>
using namespace std;
struct A{
A() = default;
A(const A&)
{
cout << "copy constructed" << endl;
}
A(A&&)
{
cout << "move constructed" << endl;
}
};
class B{
public:
B(array<A, 2>&& a)
: m_a(std::move(a))
{}
private:
array<A, 2> m_a;
};
int main(){
A foo;
cout << "=========1===========" << endl;
array<A, 2> a = { { foo, std::move(foo) } };
cout << "=========2===========" << endl;
B b(std::move(a));
cout << "=========3===========" << endl;
array<A, 2> a_second = std::move(a);
return 0;
}
输出:
===========1==========复制构造的移动===========2=======================移动构造
的移动
构造==
==================移动构造的移动
已构造
当我在Visual Studio 2013中尝试(实际上(相同的代码时,结果是不同的:
输出:
==========1===========复制构造的
移动==========2===================复制构造的副本已构造=
=======3==
=========复制构造的副本已构造
如何在 visual c++中使用移动构造函数,为什么 visual c++ 拒绝在这里使用他?
这是 MSVS 2013 中的一个错误。 MSVS 2013 不会生成隐式移动构造函数。 如果在 MSVS 2015 或 2017 中运行它,则会获得相同的输出。
我还要指出,
B(array<A, 2>& a) : m_a(std::move(a))
不是您希望将对象移动到B
中的方式。 如果你想让B
接管阵列,你应该有
B(array<A, 2>&& a) : m_a(std::move(a))
这意味着而不是使用
B b(a);
你必须使用
B b(std::move(a));
现在您可以清楚地看到a
已被从main
中移出.
>Visual Studio 2013 与 C++11 不完全兼容。对 std 容器的移动支持是"未完全实现"的部分之一。 您的示例适用于最新版本的VS2017,请参阅Rextester。
附言在这里,您可以获得有关各种编译器中C++功能支持的详细信息。
相关文章:
- Confusion: decltype vs std::function
- 完美前进使用 std::forward vs RefRefCast
- std::variant vs指向C++中异构容器基类的指针
- std::shared_ptr vs std::make_shared:意外的缓存未命中和分支预测
- C++ VS 错误:<实验/文件系统>提供 std::experimental::文件系统的标头已被Microsoft弃用,将被删除
- std::stable_sort vs std::sort
- std::memcpy vs std::copy_n for legacy c structs
- C# HashSet VS C++ std::unordered_set 使用自定义类键。C++慢...不可能。如何实现 C# 的速度?
- std::span constructor, libcxx vs libstdc++, template vs non-
- a,b = b,a in python vs std::swap() in C++
- 相同的结果 qsort vs std::sort
- std::array<const T, n> vs std::array<T, n> 过载分辨率
- std::move(std::array) g++ vs visual-c++
- 固定大小的 std::span vs std::array
- 性能比较:f(std::string&&) vs f(T&&)
- std::span.size() vs array/vector size
- C++ std::d iscrete_distribution vs. sample() 在 R 中的行为
- `noexcept`函数中的std :: terminate`调用函数有限-GCC vs clang codegen
- C++ SFINAE : is_constructible for const char[] vs std::strin
- 使用命名空间 (std:: vs ::std::) 的区别