小编vmp*_*str的帖子

带有指定模板参数的C++ 11 make_pair无法编译

我正在使用启用了-std = c ++ 11的g ++ 4.7(后面的一个快照).我试图编译一些现有的代码库,一个失败的案例让我感到困惑.

如果有人能解释发生了什么,我将不胜感激.

这是代码

#include <utility>
#include <iostream>
#include <vector>
#include <string>

int main ( )
{
    std::string s = "abc";

    // 1 ok
    std::pair < std::string, int > a = std::make_pair ( s, 7 );

    // 2 error on the next line
    std::pair < std::string, int > b = std::make_pair < std::string, int > ( s, 7 );

    // 3 ok
    std::pair < std::string, int > d = std::pair < std::string, int > ( …
Run Code Online (Sandbox Code Playgroud)

c++ templates g++ rvalue-reference c++11

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

为std :: string分配true/false:发生了什么?

我在我的源代码上测试了一个c ++ 11编译器,它在我的一个函数中发现了一个错误,我希望我的非c ++ 11编译器能够捕获它.我从一个返回类型为std :: string的函数返回false ...这是演示问题的代码

#include <iostream>

int main ( )
{
    std::string str = false;

    std::cerr << "'" << str << "'" << std::endl;

    return 0;
}


$ g++ test.cpp -W -Wall -Wextra
$ ./a.out

terminate called after throwing an instance of 'std::logic_error'
  what():  basic_string::_S_construct NULL not valid
Aborted
Run Code Online (Sandbox Code Playgroud)

我很惊讶这段代码编译没有任何问题.我怀疑异常描述是编译器将false转换为0然后转换为NULL并将其用作char*来尝试构造字符串.

但是,当我将false切换为true时,这是我得到的:

$ g++ test.cpp -W -Wall -Wextra
test.cpp: In function ‘int main()’:
test.cpp:5: error: conversion from ‘bool’ to non-scalar type ‘std::string’ requested
Run Code Online (Sandbox Code Playgroud)

在我看来,这是一个更合理的结果.

有人可以澄清为什么这种看似不一致的行为会发生吗?也就是说,std::string a …

c++ string gcc g++ std

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

bash:将脚本的输出作为脚本执行

我正在编写一个简单的脚本来生成给定长度的a和b的所有组合(比如说10).我希望能够在命令行上执行此操作(我知道如果我只是将所有内容放在bash脚本文件中并执行它,这相当容易).但是,我想知道是否有可能没有任何额外的文件.这是我到目前为止所拥有的:

n=10;
for i in `seq 1 1 $n`; do
    echo "for a$i in {a..b}; do ";
done;
echo -n "echo ";
for i in `seq 1 1 $n`; do
    echo -n '$'"a$i"; done;
    echo;
for i in `seq 1 1 $n`; do
    echo "done;";
done
Run Code Online (Sandbox Code Playgroud)

(我将代码格式化为可读性,但实际上它只是在提示符的一行上运行)

这给了我以下输出:

for a1 in {a..b}; do 
for a2 in {a..b}; do 
for a3 in {a..b}; do 
for a4 in {a..b}; do 
for a5 in {a..b}; do 
for a6 in {a..b}; do 
for a7 …
Run Code Online (Sandbox Code Playgroud)

bash

7
推荐指数
1
解决办法
8931
查看次数

std::unordered_map::emplace 对象创建

我正在选择将事物放入 unordered_map 的两种方法之一:

std::unordered_map<Key, Value> map;
map.emplace(
  std::piecewise_construct,
  std::forward_as_tuple(a),
  std::forward_as_tuple(b, c, d));
Run Code Online (Sandbox Code Playgroud)

对比

std::unordered_map<Key, DifferentValue> map;
auto& value = map[a];
if (value.isDefaultInitialized())
  value = DifferentValue(b, c, d);
Run Code Online (Sandbox Code Playgroud)

我做了一些实验,看看哪个效果更好,发现在插入唯一元素时,行为(如效率)基本上是等效的。

然而,在插入重复项的情况下,考虑到Value或DifferentValue的构造不是微不足道的,我惊讶地发现,emplace构造对象而不管它是否插入它。

因此,在这种情况下,第二种方法似乎胜出,因为默认构造函数中只有 isDefaultInitialized_(true) 而不是更多。

对于 emplace,代码似乎是:

... _M_emplace(std::true_type, _Args&&... __args) {
  __node_type* __node = _M_allocate_node(std::forward<_Args>(__args)...);
  const key_type& __k = this->_M_extract()(__node->_M_v);
  ...
  if (__node_type* __p = _M_find_node(__bkt, __k, __code)) {
     _M_deallocate_node(__node);
     return std::make_pair(iterator(__p), false);
  }
  return std::make_pair(_M_insert_unique_node(__bkt, __code, __node), true);
}
Run Code Online (Sandbox Code Playgroud)

因此,尽管我将使用第二种方法(即使它需要移动赋值和移动构造函数和额外的字段),但我想知道为什么 emplace 创建一个后来忽略的对象有很好的理由吗?也就是说,它是否应该首先检查它是否需要创建对象并在它已经存在时提前退出?

(请注意,对于我的特殊情况,默认初始化项不被认为是有效的,所以问题实际上只是关于 emplace)

作为记录,我在 23.2.4 表 102 下找到了一些内容:

E?ects: Inserts …
Run Code Online (Sandbox Code Playgroud)

c++ unordered-map c++11 emplace

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

通过ssh执行命令,然后运行bash

我正在尝试设置一个打开终端的脚本,对远程服务器执行ssh,并执行命令(在我的情况下是tail -F logfile).

到目前为止我所拥有的是以下内容

gnome-terminal -e 'ssh -t server "tail -F logfile"'
Run Code Online (Sandbox Code Playgroud)

这在某种程度上起作用.-t确保通过远程运行的命令发送SIGINT之类的信号.

但是,当我按下ctrl-c尾部时,我真的想下载到远程服务器上的 bash终端.现在,如果我按下ctrl-c尾部,则尾部关闭,这会导致ssh退出,这会导致整个终端关闭.

我想要的是尾部被终止并留在远程服务器上的bash shell.

我尝试过以下方法:

gnome-terminal -e 'ssh -t server "tail -F logfile; /bin/bash"'
Run Code Online (Sandbox Code Playgroud)

但这似乎不起作用.也就是说,如果我在没有gnome-terminal的情况下运行它,只需要ssh -t ...,那么请看以下内容:

some lines
from the log
^CConnection to server closed.
Run Code Online (Sandbox Code Playgroud)

但是,如果我这样做

gnome-terminal -e 'ssh -t server "nonexistantcommand; /bin/bash"'
Run Code Online (Sandbox Code Playgroud)

然后我得到nonexistantcommand没有发现错误,然后我下降到一个bash在远程服务器上...

有没有人对如何实现这一目标有任何建议或暗示?提前致谢.

ssh bash gnome-terminal

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

在c ++ 11中重新绑定lambda ...是否可能?

我有一种情况,我有一个lambda作为由某个函数调用创建的成员变量.问题在于它将此作为其操作的一部分.后来,我希望能够复制整个对象......

但是,在复制时我不知道lambda是如何创建的(它可以通过不同的代码路径在几个位置定义).因此,我对复制构造函数中的内容感到有些不知所措.理想情况下,我希望将lambda的捕获"重新绑定"到创建的新"this".

这是可能吗?

这是一些示例代码:

#include <iostream>
#include <string>
#include <functional>

class Foo
{
  public:

    Foo () = default;
    ~Foo () = default;

    void set (const std::string & v)
    {
        value = v;
    }

    void set ()
    {
        lambda = [&]()
        {
            return this->value;
        };
    }

    std::string get ()
    {
        return lambda();
    }


    std::string value;
    std::function <std::string (void)> lambda;
};

int main ()
{
    Foo foo;

    foo.set ();
    foo.set ("first");

    std::cerr << foo.get () << std::endl; // prints "first"

    foo.set ("captures …
Run Code Online (Sandbox Code Playgroud)

c++ lambda c++11

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