小编Har*_*rry的帖子

std::move() 和 std::add_rvalue_reference() 的区别

有人可以解释之间的差异std::move()std::add_rvalue_reference()?两者的目的相同吗?如果是,一个比另一个的优势是什么?

c++ c++11

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

std库`emplace`函数是否使用`std::in_place`标签

我想知道 C++ 标准库emplace函数是否使用std::in_place标签(以指示应就地构造所包含的对象)?因为emplace函数是在 c++11 和std::in_placec++17 中引入的。

c++ c++11 c++17

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

如何比较和递增原子变量

我想知道是否可以使用单个原子操作执行原子变量的比较和增量。这是我到目前为止所写的(线程的片段代码)

std::atomic<int> counter; //global variable

if(counter<25)
{
counter++;
}
else
{
     //send serial/socket data
}
Run Code Online (Sandbox Code Playgroud)

我知道我做错了,因为原子变量计数器被访问了两次(一次用于获取数据,另一次用于增量)。但是如果另一个线程在获取变量值之后和增量之前对“计数器”执行一些更新操作,这可能会导致问题。所以我想知道是否可以一次完成这两个操作。另外我不想使用互斥锁。

multithreading c++11

2
推荐指数
1
解决办法
3097
查看次数

std::move(std::string) 不使传递的参数为空状态

我有点困惑为什么std::move(std::string)不将传递的std::string参数设置为空状态(我的意思是std::string大小为 0 及其内部缓冲区nullptr在调用后指向std::move(std::string))。这是示例代码

#include <iostream>
#include <string>

void print(std::string& str) {
    std::cout << "lref\n";
    std::cout << str << "\n" << std::endl;
}

void print(const std::string& str) {
    std::cout << "const lref\n";
    std::cout << str << "\n" << std::endl;
}

void print(std::string&& str) {
    std::cout << "rref\n";
    std::cout << str << "\n" << std::endl;
}

int main() {
    std::string str_a = "Hello, ";
    std::string str_b = "world!";
    
    print(str_a);
    print(str_b);
    print(str_a + …
Run Code Online (Sandbox Code Playgroud)

c++

2
推荐指数
1
解决办法
556
查看次数

检查类模板实例化是否属于同一类模板

如何检查两个类模板实例化是否属于同一个类模板。这是我的代码

#include <iostream>
#include <type_traits>

template<typename T1, typename T2>
class A {
    float val;
public:

};

int main() {
    A<double, double> a_float_type;
    A<int, int> a_int_type;

    // how to check whether both a_double_type and a_int_type were instantiated from the same template class A<,>
    std::cout << std::is_same<decltype(a_float_type), decltype(a_int_type)>::value << std::endl; // returns false
}
Run Code Online (Sandbox Code Playgroud)

我的编译器只支持C++11

c++ type-traits c++11 is-same

2
推荐指数
1
解决办法
91
查看次数

从 std::list 中 std::move 元素后获得无效输出

我试图了解 std::move 。在我的代码中,我正在从内部包含两个字段的std::list<struct Data>位置移动一个元素,但我没有得到预期的输出。这是我的代码:struct Datastd::string

#include <iostream>
#include <string>
#include <list>

struct Data {
    std::string topic {};
    std::string msg {};

    Data(const std::string& topic, const std::string& msg) {
        this->topic = topic;
        this->msg = msg;
    }
};

int main() {
    std::list<Data> data_list;
    data_list.push_back(Data("A", std::string(1000, 'a')));
    data_list.push_back(Data("B", std::string(1000, 'b')));
    data_list.push_back(Data("C", std::string(1000, 'c')));
    data_list.push_back(Data("D", std::string(1000, 'd')));
    data_list.push_back(Data("E", std::string(1000, 'e')));
    
    while (!data_list.empty()) {
        std::cout << (void*)&data_list.front() << "\n";
        Data&& d1 = std::move(data_list.front());
        data_list.pop_front();
        std::cout << d1.topic << ", " << d1.msg …
Run Code Online (Sandbox Code Playgroud)

c++ stdlist stdmove

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

如何 std::forward 类模板参数

std::forward在类模板参数上使用时出现编译器错误,但在函数模板参数上使用时却没有。我想知道如何std::forward类模板参数。这是我的代码:

\n
#include <iostream>\n#include <vector>\n\ntemplate<typename T>\nclass Data_List {\n    std::vector<T> data_list;\n    \npublic:\n    Data_List() = default;\n    ~Data_List() = default;\n    \n    std::size_t get_list_size() {\n        return data_list.size();\n    }\n    \n    void add_to_list(T&& data) {\n        std::cout << "\\nbefore inside add_to_list: " << data.size() << std::endl;\n        data_list.push_back(std::forward<T>(data));\n        std::cout << "after inside add_to_list: " << data.size() << std::endl;\n    }\n};\n\ntemplate<typename T>\nvoid print(T&& t) {\n    \n}\n\nint main() {\n    Data_List<std::vector<int>> list_of_data;\n\n    std::vector<int> data(100, 2);\n    std::cout << "\\n1. before size: " << data.size() << std::endl;\n    std::cout << "1. before …
Run Code Online (Sandbox Code Playgroud)

c++

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

如何将 std::move 堆分配的 char 数组到 std::string

是否可以将std::move堆分配的 char 数组(>= 10000 大小)转换为std::string. 我试图阻止将(std::string str(c_arr))char 数组数据复制到堆分配的std::string位置。c_arr

c++

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

使用 constexpr 变量作为 case 标签

使用 constexpr 变量作为 case 标签是否正确?

#include <iostream>

int main() {
    constexpr int x = 5;

    int y = 4;

    switch (y) {
        case x - 1:
            std::cout << "case " << x << std::endl;

            break;

        case 20:
            std::cout << "case 20" << std::endl;

            break;

        default:
            std::cout << "case default" << std::endl;

            break;
    }
}
Run Code Online (Sandbox Code Playgroud)

c++ switch-statement constexpr c++17

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

如何使用 emplace 将 std::vector 元素插入 std::unordered_map

如何将std::vectoras 值的元素插入std::unordered_mapusingemplacestd::piecewise_construct。这是我的示例代码

#include <iostream>
#include <string>
#include <vector>
#include <unordered_map>

int main() {
    std::unordered_map<std::string, std::vector<int>> umap;
    umap.emplace(std::piecewise_construct, std::forward_as_tuple("abc"), std::forward_as_tuple({ 1, 2, 3, 4 }));
}
Run Code Online (Sandbox Code Playgroud)

我收到以下错误

error: too many arguments to function 'constexpr std::tuple<_Elements&& ...> std::forward_as_tuple(_Elements&& ...) [with _Elements = {}]'
Run Code Online (Sandbox Code Playgroud)

c++

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

如何从数组的子集初始化 Vec?

我有一个固定大小u8的数组 size 2048,它从不同长度的网络数据中填充。我需要将此数据复制到Vec大小u8等于接收长度的数据。

这就是我以前在 C++ 中的做法:

char buff[2048];
ssize_t data_len = recvfrom(socket, buff, sizeof(buff), 0, nullptr, nullptr);

std::vector<char> vec_buff(buff, buff + data_len)
Run Code Online (Sandbox Code Playgroud)

我知道Vec<T>implsFrom<[T; N]>并且可以使用该方法从数组创建它From::from(),但这需要整个大小2048,但我只想要data_len字节。

rust

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

检查两个函数签名是否属于同一类型

如何检查两个函数签名是否属于同一类型。这是我尝试过但没有编译

#include <iostream>
#include <type_traits>
#include <functional>

struct Employee {
    int id;
    int age;

    Employee(const int id, const int age) {
        this->id = id;
        this->age = age;
    }

    void print() const {
        std::cout << "ID: " << id << ", AGE: " << age << std::endl;
    }
};

template<typename T, typename Comp>
const T& get_min_emp(const T& a, const T& b, Comp comp) {
    static_assert(std::is_same<Comp, bool(*)(const T&, const T&)>::value, "invalid comparator");
    return comp(a, b) ? a : b;
}

int main() …
Run Code Online (Sandbox Code Playgroud)

c++

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