小编doo*_*sta的帖子

如何编写正确的std :: initializer_list构造函数

考虑以下代码:

#include <iostream>
#include <vector>

struct C {
    std::vector<int> a;
    std::string b;
    bool c;
};

void printC(const C &c) {
    // ...
}

int main() {
    printC({
        { 1, 2, 3 },
        "ehlo",
        false
    });
}
Run Code Online (Sandbox Code Playgroud)

这是有效的,因为编译器可以为我生成适当的构造函数.但是,如果我将struct C更改为:

struct C {
    std::vector<int> a;
    std::string b;
    bool c;

    C() {
        c = false;
    }
};
Run Code Online (Sandbox Code Playgroud)

printC调用停止工作,因为编译器停止生成适当的构造函数.我试过用std :: initializer_list写自己的构造函数但是失败了.

所以问题是 - 如何编写构造函数,使上面的代码再次编译和工作?

c++ constructor initializer-list c++11

5
推荐指数
2
解决办法
203
查看次数

在管道、或、和之后保留 doskey 上下文

我以以下方式定义了多个 doskey:

doskey ll=dir $*
doskey grep=findstr $*
doskey make=mingw32-make $*
Run Code Online (Sandbox Code Playgroud)

我想在一行命令中结合使用它们,例如:

ll | grep my_folder
Run Code Online (Sandbox Code Playgroud)

或者

make && make install
Run Code Online (Sandbox Code Playgroud)

但是在第一个管道/非/和运算符之后,doskeys似乎不再存在,因为cmd将无法识别这些命令。例如,虽然单个make命令有效,但调用echo hello && make会告诉我 make 未被识别为命令。

有没有办法保留 doskey 上下文,以便我可以将它们链接在一起,如上所述?

另外,同样的问题也适用于使用 doskeys 运行批处理文件,有没有办法也保留上下文?

我听说过 doskey 的 $T 参数,但我不太确定我是否理解它。

感谢您提前的帮助

environment cmd doskey

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

为什么 std::function 没有进行类型检查?

#include <functional>

void toggleOk(bool& b) { b = !b; }
void toggleBroken(bool b) { b = !b; }
void toggleInt(int i) { i = !i; }
void tooManyParams(bool b, int i) { i = !b; }

int main()
{
    typedef std::function<void(bool&)> CallbackType;
    typedef std::function<void(bool)> WrongCallbackType;

    CallbackType cb1 = [](bool b) { b = !b; }; // Should throw error - missing reference
    CallbackType cb2 = toggleOk; // Ok

    CallbackType cb3 = toggleBroken; // Should throw error - missing reference
    CallbackType …
Run Code Online (Sandbox Code Playgroud)

c++ function c++11 std-function c++17

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

std :: stoul不会抛出std :: out_of_range

考虑以下代码:

#include <iostream>
#include <cstring>
#include <cerrno>

int main() {
    unsigned long num = strtoul("0xFFFFFFFFFFFF11223344556677889900AABBCCDDEEFF", NULL, 16);
    std::cout << std::strerror(errno) << "\n";
    unsigned long num2 = std::stoul("0xFFFFFFFFFFFF11223344556677889900AABBCCDDEEFF");
    std::stoul("hello world");
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

预计该代码会从strerror打印一些“超出范围”,然后根据文档抛出out_of_range异常。它永远不会到达最后的污迹线。

实际上,它不会引发第二个stoul语句。我已经尝试了GCC 4.8.5和MinGW 8.2.0,但均未引发out_of_range异常,并且仅在最后一个stoul语句上传递了invalid_argument。

这是应该报告的错误,还是我缺少某些东西,并且这是预期的行为?

c++ g++ exception g++4.8

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