我是emacs的新手,并且有一个菜鸟问题.我可以将一个键绑定到一个特定的函数(global-set-key (kbd "C-c a b c") 'some-command),其中some-command是一个函数.我怎样才能调用两个函数(比如some-command和some-other-command一个键绑定)?非常感谢!
以下代码给出了悬空指针错误。
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
假设我有一张地图
std::map<int, double> foo;
是否foo[2] += 3.0;定义了我写作的行为?也就是说,0.0在我的情况下,是否有任何隐式添加的地图元素自动初始化(希望如此)?
如果没有,我是否引入了卡车装载的未定义行为?如果是这样,我可以用分配器做一些时髦的事情来强制执行初始化0.0吗?
我想了解使用一种形式而不是另一种形式(如果有的话)的区别.
代码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)
语义有什么不同,或者它只是语法吗?
我有一个std::vector在我称之为reserve一个较大的值.然后我检索data().
由于迭代data然后崩溃,我想知道这是否是允许的.被reserve强制更新data已分配内存的范围是多少?
这是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,编译器抱怨:
Run Code Online (Sandbox Code Playgroud)error C2440: '=': cannot convert from 'std::basic_string<char,std::char_traits<char>,std::allocator<char>>' to 'const char *'
代码工作只有当我更换""使用string("").我不明白为什么隐式转换适用于我的自定义函数但不起作用accumulate.你能解释一下吗?非常感谢.
PS:我正在使用Visual Studio 2015.
一位同事不小心写了这样的代码:
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编译了这个.
这个编译的规则是什么?
为什么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) 我发现许多文章解释了“默认初始化和值初始化”之间的区别,但实际上我并不清楚。
这是一个例子:
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
我有以下代码:
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销毁,为什么?