小编use*_*677的帖子

为什么我们复制然后移动?

我看到某个地方有人决定复制一个对象并随后将其移动到一个类的数据成员的代码.这使我感到困惑,因为我认为移动的重点是避免复制.这是一个例子:

struct S
{
    S(std::string str) : data(std::move(str))
    {}
};
Run Code Online (Sandbox Code Playgroud)

这是我的问题:

  • 为什么我们不采用右值引用str
  • 副本不会很贵,特别是给出类似的东西std::string吗?
  • 作者决定复制然后移动的原因是什么?
  • 我应该什么时候自己做?

c++ move-semantics c++11

97
推荐指数
4
解决办法
7736
查看次数

Emacs:符号作为变量的值是无效的

这是我的~/.emacs档案:

(setq-default c-basic-offset 4 c-default-style "linux")
(setq-default tab-width 4 indent-tabs-mode t)
(define-key c-mode-base-map (kbd "RET") 'newline-and-indent)
Run Code Online (Sandbox Code Playgroud)

我打开emacs时收到警告:

警告(初始化):加载时发生错误 c:/home/.emacs:

符号的值作为变量是无效的: c-mode-base-map

要确保正常操作,您应该调查并删除初始化文件中的错误原因.使用--debug-init选项启动Emacs 以查看完整的错误回溯.

我跑了--debug-init,这就是它返回的内容.我不知道我的意思:

调试器输入 - Lisp错误:(void-variable c-mode-base-map)

(define-key c-mode-base-map (kbd "RET") (quote newline-and-indent)) 

eval-buffer(#<buffer *load*> nil "c:/home/.emacs" nil t)

; Reading at buffer position 311
load-with-code-conversion("c:/home/.emacs" "c:/home/.emacs" t t)

load("~/.emacs" t t)
Run Code Online (Sandbox Code Playgroud)

emacs

22
推荐指数
1
解决办法
2万
查看次数

为什么带有"相同签名"的模板和非模板函数的重载调用非模板函数?

我有这个代码:

template<
    class T = const int &
> void f(T) {}

void f(const int &) {}

int main() {
   f(0);
}
Run Code Online (Sandbox Code Playgroud)

为什么称它为第二个而不是第一个?我会认为它们是相同的,但它们显然不是因为我没有得到重新定义错误.

c++ templates overloading c++11

18
推荐指数
2
解决办法
3542
查看次数

如何从元组中获得第N类?

我想创建一个模板,我可以在其中输入索引,它将为我提供该索引的类型.我知道我可以这样做,decltype(std::get<N>(tup))但我想自己实现.例如,我想这样做,

typename get<N, std::tuple<int, bool, std::string>>::type;
Run Code Online (Sandbox Code Playgroud)

...它会给我位置的类型N - 1(因为数组从0开始索引).我怎样才能做到这一点?谢谢.

c++ templates c++11 stdtuple

17
推荐指数
2
解决办法
3215
查看次数

链接什么是什么意思?

我经常听到"连接图书馆"一词.我是编译器的新手,因此我很想了解这一点.

链接库是什么意思,什么时候不这样做会导致问题?

c++ compiler-construction linker

15
推荐指数
1
解决办法
4035
查看次数

read,readsome,get和getline之间有什么区别?

这些功能有什么区别.当我使用它们时,它们都做同样的事情.例如,所有三个调用都返回"hello":

#include <iostream>
#include <sstream>

int main()
{
    stringstream ss("hello");
    char x[10] = {0};
    ss.read(x, sizeof(x));          // #1
    std::cout << x << std::endl;
    ss.clear();
    ss.seekg(0, ss.beg);
    ss.readsome(x, sizeof(x));      // #2
    std::cout << x << std::endl;
    ss.clear();
    ss.seekg(0, ss.beg);
    ss.get(x, sizeof(x));           // #3
    std::cout << x;
    ss.clear();
    ss.seekg(0, ss.beg);
    ss.getline(x, sizeof(x));       // #4
    std::cout << x << std:endl;
}
Run Code Online (Sandbox Code Playgroud)

c++

14
推荐指数
2
解决办法
7520
查看次数

为什么不调用move-constructor?

为什么在这个例子中没有打印出来?我正在Coliru的Clang编译.

#include <iostream>

struct S
{
    S()    noexcept = default;
    S(S&&) noexcept { std::cout << "move-ctor"; }
};

void f(S) {}

int main()
{
    f(S{});
}
Run Code Online (Sandbox Code Playgroud)

c++ c++11

10
推荐指数
1
解决办法
332
查看次数

为什么我在命令行上有 (master|MERGING) 以及如何摆脱它?

出于某种原因,每当我进入命令行时,这就是我在 cwd 旁边看到的内容:

在此处输入图片说明

几天前,我收到一条错误消息,说我遇到了合并冲突。我不知道这意味着什么,所以我停止尝试提交。现在,每当我进入 git 终端时,我都会看到(master|MERGING). 每当我尝试提交时(即使它不在同一个遥控器上),我都会收到一个冗长的错误:

在此处输入图片说明

它说要修复错误,但我不知道该怎么做。我到底需要做什么?

git

6
推荐指数
1
解决办法
2275
查看次数

如何让它调用正确的构造函数?

当我创建一个像这样的用户定义类的数组时,它将默认构造每个元素:

S s[5]; // calls default constructor five times, one for each S object
Run Code Online (Sandbox Code Playgroud)

但是如果我的类不是默认构造的呢?我如何能够实例化并稍后使用此数组?

例如,我的类S可能不是默认构造的,但它确实有另一个这样的构造函数:

S(int, int);
Run Code Online (Sandbox Code Playgroud)

如何让它调用此构造函数而不是默认构造函数?

c++ constructor default-constructor

5
推荐指数
1
解决办法
145
查看次数

当涉及路径时,如何编写与系统无关的代码?

假设我正在创建一个使用某个库的项目,并且我必须在链接时提供该库的路径。在命令行或 makefile 中,我可能有:

g++ ... -L/path/to/mylibrary
Run Code Online (Sandbox Code Playgroud)

我也会把这个项目发给其他想要使用它的人。他们系统上的路径可能不一定与我的相同。他们可能一起使用不同的文件路径。

我如何确保库的路径对我的计算机和我的项目的接收者都有效?

c++ linker makefile path

5
推荐指数
1
解决办法
347
查看次数