编程时我发现了一些有趣的东西:
enum class Foo {
FOO_THING,
FOO_TOO
};
int main() {
Foo foo{1}; // It is OK
Foo foo2(1); // It is an invalid
}
Run Code Online (Sandbox Code Playgroud)
你能告诉我,为什么foo{1}编译器可以,为什么foo2(1)无效?
编译器GCC(g++ (Ubuntu 7.3.0-21ubuntu1~16.04) 7.3.0)说:
$ g++ -Wall -std=c++17 foo.cpp
error: cannot convert ‘int’ to ‘Foo’ in initialization
Foo foo2(1);
Run Code Online (Sandbox Code Playgroud)
我真的想知道潜在的机制.:)))
编辑:也许是一些编译器bug ...
我有一个看起来像的字符串
/foo/bar/baz59_ 5stuff.thing
如果它比另一个变量大,我想将最后一个数字(在示例中为5)增加一个.A 9将增加到10.注意,最后一个数字也可以是多个数字; "stuff.thing"也可以是任何东西; 除了数字; 所以它不能被硬编码.
上面的例子会导致 /foo/bar/baz59_ 6stuff.thing
我发现了多个问题(和答案),它们会从字符串中提取最后一个数字,显然可以用于比较.我遇到的问题是如何确保当我进行替换时,我只替换最后一个数字(因为很明显我不能只将"5"替换为"6").有人可以提出任何建议吗?
awk/sed/bash/grep都是可行的.
我试图转发声明一些仅在类中私下使用的变量,以限制使用此时必须包含的标头数.
可悲的是,我想要转发的类已经证明是一个typedef,它是一个我无法编辑的第三方库(为了论证我们称之为"boost :: asio :: strand")
这个问题在C++中转发typedef的声明 证明了唯一的解决方案是:
看看第二个解决方案,有没有什么方法可以保护自己免受库中typedef更改的影响,以便编译器在删除/重命名类时使用typedef而不是使用未定义类型,并使其更少维持头痛?
我试图找出与内存模型相关的这三种问题之间的区别。
如果我想模拟一个memory leak场景,我可以创建一个指针,而不调用相应的删除方法。
int main() {
// OK
int * p = new int;
delete p;
// Memory leak
int * q = new int;
// no delete
}
Run Code Online (Sandbox Code Playgroud)
如果我想模拟一个double free场景,我可以释放一个指针两次,这部分内存稍后将被分配两次。
a = malloc(10); // 0xa04010
b = malloc(10); // 0xa04030
c = malloc(10); // 0xa04050
free(a);
free(b); // To bypass "double free or corruption (fasttop)" check
free(a); // Double Free !!
d = malloc(10); // 0xa04010
e = malloc(10); // 0xa04030
f = malloc(10); // …Run Code Online (Sandbox Code Playgroud) 最近我在C++中使用auto时遇到了非常奇怪的问题,只是...看看下面的代码片段:
我的主要功能:
#include <list>
#include <iostream>
#include <stdio.h>
int main(){
int a = 10, b = 20, c = 30;
list<int> what;
what.push_back(a);
what.push_back(b);
what.push_back(c);
read(what);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
这里的功能如下:
void read(const list<int>& con){
for (auto it : con){
printf("%p\n", &it);
cout << it << endl;
}
return ;
}
Run Code Online (Sandbox Code Playgroud)
这是输出:
0x7fffefff66a4
10
0x7fffefff66a4
20
0x7fffefff66a4
30
Run Code Online (Sandbox Code Playgroud)
那是什么呀?具有不同内容的相同地址!
更奇怪的是,如果我通过添加'&'
来修改for循环,那么:
for (auto& it : con){
Run Code Online (Sandbox Code Playgroud)
所有输出立即有意义,地址将通过迭代改变
所以我的问题是,
为什么'&'标志在这种情况下会发生变化?
请注意,这不是C++中的含义 - >意味着什么?
这个问题特定于C++ 11; 函数可以是这样的:
struct string_accumulator {
}
inline auto collect() -> string_accumulator
{
return string_accumulator();
}
Run Code Online (Sandbox Code Playgroud)
在这种情况下, - >的含义是什么?