从 C++11 之前的代码调用 C++11 库时移动语义
Move semantics when calling a C++11 library from pre-C++11 code
假设您使用 class MyClass
创建了一个库,该库具有适当的移动赋值运算符和移动构造函数。此外,该库已正确定义和实现 MyClass MyClass::operator + (const MyClass& other)
。这个 class 是用 -std=c++11
编译的,以便这些运算符和像 MyClass&&
这样的语法有意义。
如果您稍后有一个程序 not 使用此库使用 -std=c++11
编译并创建 class MyClass
的实例,您会吗能够利用移动语义?
也就是说,下面会调用MyClass
的move构造函数吗?
MyClass first, second;
// initialize first and second
MyClass moved = first + second; // hopefully uses move semantics
我知道这段代码无法创建自己的 class 并使用像 MyClass&&
这样的语法而不会出现编译错误,但希望它仍然能够通过以下方式利用 C++11使用 C++11 库...
感谢您的澄清。
C++03 和 C++11 的 ABI 没有区别,所以 object 文件不是问题。您的库可以在内部尽可能多地使用 C++11,但是使用 C++11 语法的 headers 不能用于 C++03 项目,编译器会抛出错误。
库单独编译的内部实现细节可能会使用移动语义。 header 和调用者可能不会使用移动语义,因为它们不受支持。
假设您使用 class MyClass
创建了一个库,该库具有适当的移动赋值运算符和移动构造函数。此外,该库已正确定义和实现 MyClass MyClass::operator + (const MyClass& other)
。这个 class 是用 -std=c++11
编译的,以便这些运算符和像 MyClass&&
这样的语法有意义。
如果您稍后有一个程序 not 使用此库使用 -std=c++11
编译并创建 class MyClass
的实例,您会吗能够利用移动语义?
也就是说,下面会调用MyClass
的move构造函数吗?
MyClass first, second;
// initialize first and second
MyClass moved = first + second; // hopefully uses move semantics
我知道这段代码无法创建自己的 class 并使用像 MyClass&&
这样的语法而不会出现编译错误,但希望它仍然能够通过以下方式利用 C++11使用 C++11 库...
感谢您的澄清。
C++03 和 C++11 的 ABI 没有区别,所以 object 文件不是问题。您的库可以在内部尽可能多地使用 C++11,但是使用 C++11 语法的 headers 不能用于 C++03 项目,编译器会抛出错误。
库单独编译的内部实现细节可能会使用移动语义。 header 和调用者可能不会使用移动语义,因为它们不受支持。