小编son*_*yao的帖子

Emacs用于多个命令的键绑定

我是emacs的新手,并且有一个菜鸟问题.我可以将一个键绑定到一个特定的函数(global-set-key (kbd "C-c a b c") 'some-command),其中some-command是一个函数.我怎样才能调用两个函数(比如some-commandsome-other-command一个键绑定)?非常感谢!

emacs elisp key-bindings

13
推荐指数
2
解决办法
5535
查看次数

警告:支持指针的对象将在 std::pair 的完整表达式末尾被销毁

以下代码给出了悬空指针错误。

    std::vector<std::pair<std::string, int>> c;
    for (auto& b : c) {
        const auto& [s, i] = b;
        std::string_view v = s.substr(i);
        std::cout << v;
    }
Run Code Online (Sandbox Code Playgroud)

我认为它b保存了对 的引用std::pair<std::string, int>,所以s应该是对pair对象中字符串的引用。为什么这会产生悬空指针错误?我在这里缺少什么?godbolt 链接: https: //godbolt.org/z/4zMvbr

c++ temporary stdstring string-view c++17

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

添加到std :: map的元素是否自动初始化?

假设我有一张地图

std::map<int, double> foo;

是否foo[2] += 3.0;定义了我写作的行为?也就是说,0.0在我的情况下,是否有任何隐式添加的地图元素自动初始化(希望如此)?

如果没有,我是否引入了卡车装载的未定义行为?如果是这样,我可以用分配器做一些时髦的事情来强制执行初始化0.0吗?

c++ dictionary initialization

12
推荐指数
1
解决办法
143
查看次数

成员初始化程序列表和非静态数据成员上的默认成员初始值设定项之间的区别是什么?

我想了解使用一种形式而不是另一种形式(如果有的话)的区别.

代码1(直接在变量上初始化):

#include <iostream>

using namespace std;

class Test 
{
public:
    Test() {
        cout<< count;
    }

    ~Test();

private:
    int count=10;
};

int main()
{
    Test* test = new Test();
}
Run Code Online (Sandbox Code Playgroud)

代码2(init与构造函数上的初始化列表):

#include <iostream>

using namespace std;

class Test 
{
public:
    Test() : count(10) {
        cout<< count;
    }

    ~Test();

private:
    int count;
};

int main()
{
    Test* test = new Test();
}
Run Code Online (Sandbox Code Playgroud)

语义有什么不同,或者它只是语法吗?

c++ variables class init

12
推荐指数
3
解决办法
2462
查看次数

保留后使用std :: vector :: data

我有一个std::vector在我称之为reserve一个较大的值.然后我检索data().

由于迭代data然后崩溃,我想知道这是否是允许的.被reserve强制更新data已分配内存的范围是多少?

c++ vector stdvector language-lawyer

12
推荐指数
2
解决办法
1673
查看次数

为什么隐式转换在累积中不起作用?

这是C++程序:

#include <iostream>
#include <vector>
#include <numeric>
using namespace std;

int test_string(const string & str) {
    return str.size();
}

void main() {
    test_string("");                                     //can compile
    vector<string> v;
    string sum = accumulate(v.cbegin(), v.cend(), "");   //cannot compile
}
Run Code Online (Sandbox Code Playgroud)

我想使用隐式转换,从const char *string仿制STL函数的调用accumulate.我知道转换const char *为字符串不是显式的,因此我们可以将const char *参数传递给需要string类型的调用.这可以通过上述test_string功能证明.但当我做同样的事情时accumulate,编译器抱怨:

error C2440: '=': cannot convert from 'std::basic_string<char,std::char_traits<char>,std::allocator<char>>' to 'const char *'
Run Code Online (Sandbox Code Playgroud)

代码工作只有当我更换""使用string("").我不明白为什么隐式转换适用于我的自定义函数但不起作用accumulate.你能解释一下吗?非常感谢.

PS:我正在使用Visual Studio 2015.

c++ string templates implicit-conversion

12
推荐指数
2
解决办法
619
查看次数

为什么代码"foo :: foo :: foo :: foob"编译?

一位同事不小心写了这样的代码:

struct foo {
  foo() : baz(foobar) {}
  enum bar {foobar, fbar, foob};
  bar baz;
};

void f() {
  for( auto x : { foo::foobar,
                  foo::fbar,
                  foo::
                  foo::
                  foo::foob } );
    // ...
}
Run Code Online (Sandbox Code Playgroud)

GCC 5.1.0编译了这个.

这个编译的规则是什么?

c++ gcc names language-lawyer c++11

12
推荐指数
1
解决办法
2048
查看次数

emplace_back导致静态constexpr成员上的链接错误

为什么emplace_back要引用需要定义的成员?emplace_back(integer literal)和之间有什么区别emplace_back(static constexpr integer member)

如果我切换到C++ 17,它编译得很好.我发现在C++ 17中,静态constexpr数据成员是隐式内联的.这是否意味着编译器隐式为它们创建定义?

示例代码:

class base {
    int n;
public:
    base(int n):n(n) {}
};

struct base_trait {
    static constexpr int n = 1;
};

int main(void) {
    vector<base> v;
    v.emplace_back(1);  // ok
    v.emplace_back(base_trait::n);  // link error with -std=c++14, ok with -std=c++17
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

c++ one-definition-rule language-lawyer constexpr c++17

12
推荐指数
1
解决办法
219
查看次数

默认初始化和值初始化之间的歧义

我发现许多文章解释了“默认初始化和值初始化”之间的区别,但实际上我并不清楚。

这是一个例子:

class A{
   public:
      int x;
};


int main(){
    A a;// default initialization so x has undefined value.
    A b = A(); // value initialization so x is a scalar thus it is value initialized to 0

}
Run Code Online (Sandbox Code Playgroud)

我猜上面在上面可以,但是在这里:

int value = 4; // is this considered a value-initialization?
Run Code Online (Sandbox Code Playgroud)

请帮助我了解两种初始化形式之间的主要区别。

c++ initialization value-initialization default-initialization

12
推荐指数
1
解决办法
83
查看次数

为什么在返回字符串的函数上调用std :: string.c_str()不起作用?

我有以下代码:

std::string getString() {
    std::string str("hello");
    return str;
}

int main() {
    const char* cStr = getString().c_str();
    std::cout << cStr << std::endl; // this prints garbage
}
Run Code Online (Sandbox Code Playgroud)

我以为会发生的是,getString()将返回一个复制str(getString()按价值计算收益); 因此,副本str将保持"活着" main()直到main()返回.这将cStr指向一个有效的内存位置:返回的副本的底层char[]char*(或其他)保留在哪里.strgetString()main()

但是,显然并非如此,因为程序输出垃圾.那么,问题是,何时被str销毁,为什么?

c++ string object-lifetime

11
推荐指数
2
解决办法
4471
查看次数