小编UKM*_*key的帖子

使用int初始化枚举类

编程时我发现了一些有趣的东西:

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 ...

c++ enums initialization c++17

7
推荐指数
2
解决办法
2397
查看次数

如何增加字符串中的最后一个数字; 庆典

我有一个看起来像的字符串 /foo/bar/baz59_ 5stuff.thing

如果它比另一个变量大,我想将最后一个数字(在示例中为5)增加一个.A 9将增加到10.注意,最后一个数字也可以是多个数字; "stuff.thing"也可以是任何东西; 除了数字; 所以它不能被硬编码.

上面的例子会导致 /foo/bar/baz59_ 6stuff.thing

我发现了多个问题(和答案),它们会从字符串中提取最后一个数字,显然可以用于比较.我遇到的问题是如何确保当我进行替换时,我只替换最后一个数字(因为很明显我不能只将"5"替换为"6").有人可以提出任何建议吗?

awk/sed/bash/grep都是可行的.

bash perl awk sed

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

Forward声明了typedef保护

我试图转发声明一些仅在类中私下使用的变量,以限制使用此时必须包含的标头数.

可悲的是,我想要转发的类已经证明是一个typedef,它是一个我无法编辑的第三方库(为了论证我们称之为"boost :: asio :: strand")

这个问题在C++中转发typedef的声明 证明了唯一的解决方案是:

  • 只需包含标题并接受它是不可能的
  • 转发声明什么是typedef'ed并添加我自己的typedef

看看第二个解决方案,有没有什么方法可以保护自己免受库中typedef更改的影响,以便编译器在删除/重命名类时使用typedef而不是使用未定义类型,并使其更少维持头痛?

c++ forward-declaration c++11

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

内存泄漏、访问已释放的内存和双重释放之间有什么区别?

我试图找出与内存模型相关的这三种问题之间的区别。

如果我想模拟一个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++ memory memory-leaks memory-management

3
推荐指数
1
解决办法
742
查看次数

使用'auto'进行迭代时,'&'符号会起什么作用

最近我在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++ for-loop reference auto c++11

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

什么 - >函数签名中的c ++ 11意味着什么?

请注意,这不是C++中的含义 - >意味着什么?

这个问题特定于C++ 11; 函数可以是这样的:

struct string_accumulator {
}


inline auto collect() -> string_accumulator
{
    return string_accumulator();
}
Run Code Online (Sandbox Code Playgroud)

在这种情况下, - >的含义是什么?

c++ c++11

-3
推荐指数
1
解决办法
173
查看次数