【问题标题】:Move semantics when calling a C++11 library from pre-C++11 code从 C++11 之前的代码调用 C++11 库时移动语义
【发布时间】:2015-10-20 22:10:54
【问题描述】:

假设您创建了一个库,其中包含一个类 MyClass,该类具有正确的移动赋值运算符和移动构造函数。此外,该库已正确定义和实现MyClass MyClass::operator + (const MyClass& other)。此类使用-std=c++11 编译,以便使这些运算符和MyClass&& 等语法有意义。

如果你以后有一个程序不是使用这个库编译-std=c++11并创建类MyClass的实例,你能利用移动语义吗?

那,下面会不会调用MyClass的move构造函数?

MyClass first, second;
// initialize first and second
MyClass moved = first + second; // hopefully uses move semantics

我知道这段代码无法创建自己的类并使用 MyClass&& 这样的语法而不会出现编译错误,但希望它仍然能够通过使用 C++11 库来利用 C++11。 ..

感谢您的澄清。

【问题讨论】:

  • 我怀疑您将无法编译您的程序,因为它无法识别库头文件中包含的 C++11 语法。

标签: c++ c++11 move-semantics


【解决方案1】:

C++03 和 C++11 的 ABI 没有区别,所以目标文件不是问题。您的库可以在内部尽可能多地使用 C++11,但是具有 C++11 语法的头文件不能用于 C++03 项目,编译器会抛出错误。

【讨论】:

  • C++ 没有指定 ABI,编译器可以随时更改 ABI。
  • 我猜你的意思是在 GCC 中?
  • 他们可以做到,但实际上他们做不到,至少在 Linux 上是这样。破损会很严重。
  • 如果您的编译器完全兼容,它们很可能会有所不同。一个例子是std::list,在 C++11 中,size_t 变大一倍,std::stringlibstdc++。这些在 libstdc++ 中不符合标准,除非您使用新的 abi(这显然不向后兼容)。我发布了一个类似的问题(stackoverflow.com/questions/10014042/…),接受的答案基本上是“否”。
【解决方案2】:

库单独编译的内部实现细节可能会使用移动语义。标头和调用者可能不使用移动语义,因为它们不受支持。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-01-02
    • 2014-08-16
    • 2013-05-19
    • 1970-01-01
    • 2014-03-18
    • 2023-03-26
    相关资源
    最近更新 更多