有人可以解释之间的差异std::move()和std::add_rvalue_reference()?两者的目的相同吗?如果是,一个比另一个的优势是什么?
我想知道 C++ 标准库emplace函数是否使用std::in_place标签(以指示应就地构造所包含的对象)?因为emplace函数是在 c++11 和std::in_placec++17 中引入的。
我想知道是否可以使用单个原子操作执行原子变量的比较和增量。这是我到目前为止所写的(线程的片段代码)
std::atomic<int> counter; //global variable
if(counter<25)
{
counter++;
}
else
{
//send serial/socket data
}
Run Code Online (Sandbox Code Playgroud)
我知道我做错了,因为原子变量计数器被访问了两次(一次用于获取数据,另一次用于增量)。但是如果另一个线程在获取变量值之后和增量之前对“计数器”执行一些更新操作,这可能会导致问题。所以我想知道是否可以一次完成这两个操作。另外我不想使用互斥锁。
我有点困惑为什么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) 如何检查两个类模板实例化是否属于同一个类模板。这是我的代码
#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
我试图了解 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) std::forward在类模板参数上使用时出现编译器错误,但在函数模板参数上使用时却没有。我想知道如何std::forward类模板参数。这是我的代码:
#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) 是否可以将std::move堆分配的 char 数组(>= 10000 大小)转换为std::string. 我试图阻止将(std::string str(c_arr))char 数组数据复制到堆分配的std::string位置。c_arr
使用 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) 如何将std::vectoras 值的元素插入std::unordered_mapusingemplace和std::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) 我有一个固定大小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字节。
如何检查两个函数签名是否属于同一类型。这是我尝试过但没有编译
#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)