小编Ran*_*ngo的帖子

“隐式定义的移动构造函数”可以不是微不足道的吗?

cppreference定义“简单移动构造函数”:

如果满足以下所有条件,则类 T 的移动构造函数是微不足道的:

  • 它不是用户提供的(意味着它是隐式定义或默认的);

  • T 没有虚成员函数;T 没有虚基类;

  • 为 T 的每个直接基选择的移动构造函数是微不足道的;

  • 为 T 的每个非静态类类型(或类类型数组)成员选择的移动构造函数是微不足道的。

cppreference还定义了“隐式定义的移动构造函数”:

如果隐式声明的移动构造函数既不是删除的也不是平凡的,则它由编译器定义(即生成并编译函数体)(如果 odr 使用或需要进行常量求值)。

显然,不能删除隐式声明的移动构造函数。但“这一定不是微不足道的”让我听起来很困惑。
这是否意味着如果它不是微不足道的,那么它应该是“用户提供的”?如果它已经是“用户提供的”,那么为什么必须“隐式声明的”呢?
那么这里出了什么问题呢?隐式声明的移动构造函数必须不重要的意义是什么?请帮忙。

c++ language-lawyer

4
推荐指数
1
解决办法
111
查看次数

std::move 真的有助于让我们免于复制吗?

我无法理解真实的本质std::move

  • 他们说:std::move(object)返回“对该对象的右值引用”。是的,我明白了。
  • 他们还说:使用push_back(std::move(object))而不是push_back(object)避免复制。我没有明白这一点,因为它似乎与下面的示例相矛盾:
#include <utility>      
#include <iostream>     
#include <vector>       
#include <string>       
#include <iomanip>
template <class T> void print(T const & object){
    for (auto var : object){std::cout << ' '<<var;}
    std::cout << '\n';
}
int main () {
  std::string foo = "foo-string";
  std::string bar = "bar-string";
  std::vector<std::string> myvector = { "super", "vip" , "pro" , "ok" }; // capcity=size=4;

  // this block is just to increase the capacity of the vector
  myvector.push_back( …
Run Code Online (Sandbox Code Playgroud)

c++ move-semantics

3
推荐指数
1
解决办法
245
查看次数

与链接相关的内联关键字的真正本质是什么?

我有一个严重的问题,以我浅薄的知识来协调“内联概念”与“链接”:

  • 我听说我们可以用来extern从其他文件访问“非静态实体”(例如未使用静态密钥声明的实体)
    =是!我懂了
  • 他们说我们可以用来inline使函数或变量出现在“头文件”中,以便可以跨多个翻译单元访问它
    =是!我懂了
  • 他们还说“内联实体”可以有“内部或外部链接”
    =我不明白

(A:具有内部链接的内联函数? - 这是我第一次听说具有“内部链接”的内联实体)

可以从多个翻译单元的任何位置访问内联实体,因此这是否意味着“内联实体”应该始终具有“外部链接”?

可以跨多个翻译单元从任何地方访问并具有“内部链接”的“内联实体”有什么意义?

任何答案或任何证实我在任何一点上都是错误的确认将不胜感激。

c++ inline linkage

3
推荐指数
1
解决办法
210
查看次数

标签 统计

c++ ×3

inline ×1

language-lawyer ×1

linkage ×1

move-semantics ×1