小编dfr*_*ese的帖子

std :: vector <T> :: assign使用子范围有效吗?

我想将向量转换为该向量的子范围,例如通过删除第一个和最后一个值。在这种情况下使用assign成员函数是否有效?

std::vector<int> data = {1, 2, 3, 4};
data.assign(data.begin() + 1, data.end() - 1);
// data is hopefully {2, 3}
Run Code Online (Sandbox Code Playgroud)

Cppreference指出

对容器元素的所有迭代器,指针和引用均无效。过去的迭代器也无效。

但是,直到分配结束,这种无效似乎才发生。

为了安全起见,我可以采用以下内容,但似乎比较冗长:

std::vector<int> data = {1, 2, 3, 4};
data = std::vector<int>{data.begin() + 1, data.end() - 1};
// data is now {2, 3}
Run Code Online (Sandbox Code Playgroud)

c++ undefined-behavior

8
推荐指数
1
解决办法
97
查看次数

第一个模板类型的模板参数

我正在使用一个API,它将带有单个参数的函数作为回调.回调采用某种类型的单个参数,为简单起见,我会说它返回一个bool.我试图整理的主要内容是范围检查功能.我的直觉是写这样的东西:

template<class T, T min, T max>
constexpr bool in_range(T val) {
    return (val >= min && val <= max);
}

static_assert(in_range<float, 0.0f, 1.0f>(0.5f), "doesn't work")
Run Code Online (Sandbox Code Playgroud)

但是,这不起作用,所以我默认以这种方式创建一个函数.

template<class T>
std::function<bool(T)> in_range(T min, T max) {
    auto test = [min, max](T val) {
        return (val >= min && val <= max);
    };
    return test;
}


assert(in_range<float>(0.0f, 1.0f)(0.5f))
Run Code Online (Sandbox Code Playgroud)

有没有办法以第一个函数的形式更多地编写函数,所以我不依赖std::function于运行时生成的lambdas?

c++ templates callback constexpr c++11

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

为什么 gcc 不检测所有处理的枚举值?

我有一些 C++ 代码,我可以在其中切换枚举中的值。我试图用 -Wall -Wextra -Werror 编译它。这在使用 clang 时很好。但是,GCC 抱怨未涵盖默认代码路径。简化版本如下所示:

enum class Types: int {
    A,
    B,
    C
};

bool some_logic(Types val) {
    switch (val) {
        case Types::A:
            return (false);
        case Types::B:
            return (true);
        case Types::C:
            return (false);
    }
}
Run Code Online (Sandbox Code Playgroud)

我可以通过在函数末尾添加一个 default case 或另一个 return 语句来处理这个问题。但是,我的问题是为什么 GCC 没有检测到枚举的所有情况都已涵盖?或者换一种说法,海湾合作委员会在这里抱怨是否有正当理由?

我在此处对编译器输出进行了比较。

c++ gcc gcc-warning clang++

0
推荐指数
1
解决办法
82
查看次数