我该如何让这段代码无法编译?
std::string foo;
foo = 3;
Run Code Online (Sandbox Code Playgroud)
我知道它int可以转换为char(恕我直言,一个错误。谢谢,C),并且std::string有一个char赋值运算符(恕我直言,也是一个错误)。
std::make_shared()用于直接构造对象shared_ptr并调用给定类型的构造函数,它采用该类型构造函数的参数。它如何知道类型构造函数的参数和定义?当使用 templates 和 ... 运算符时,Visual Studio Intellisense 无法显示类型构造函数的定义,而只会显示模板的通用定义,但std::make_shared()可以显示构造函数的精确定义。它是 Visual Studio Intellisense 的一个功能并且特定于标准库函数,还是我在 C++ 实现中无法猜测的东西std::make_shared()?是这样,我该如何重新创建它?
template<typename T, typename... types>
std::shared_ptr<T> my_make_shared(types... args) {
return std::shared_ptr<T>(new T(args...));
}
Run Code Online (Sandbox Code Playgroud)
这是 std::make_shared() std::make_shared() 的智能感知的样子
这是我的示例的样子我的示例的智能感知
我发现了很多设计问题,特别是传递std::array<>给函数时。基本上,当您初始化 std::array 时,它会接受两个模板参数<class T和size_t size>。但是,当您创建需要 和 的函数时std::array,我们不知道大小,因此我们还需要为函数创建模板参数。
template <size_t params_size> auto func(std::array<int, params_size> arr);
Run Code Online (Sandbox Code Playgroud)
为什么不能std::array在构造函数中获取大小?(IE):
auto array = std::array<int>(10);
Run Code Online (Sandbox Code Playgroud)
那么这些函数看起来就不那么激进了,并且不需要模板参数,如下所示:
auto func (std::array<int> arr);
Run Code Online (Sandbox Code Playgroud)
我只是想知道 的设计选择std::array,以及为什么这样设计。
这不是一个由于错误而产生的问题,而是一个为什么std::array<>要以这种方式设计的问题。
有没有办法要求给定类型在其中定义类型别名?例如,我如何编写一个概念来检查这是否有效,其中该概念检查类型 T 是否具有类型别名Bar?
template <typename T>
concept HasBarType = ????;
template <HasBarType T>
void foo() {
[[maybe_unused]] T::Bar bar;
}
Run Code Online (Sandbox Code Playgroud) 想象一下下面的定义。
struct X {
double a[8] {0.0};
double b[8] {0.0};
}
int main() {
X x;
x.a[10] = 1.0;
}
Run Code Online (Sandbox Code Playgroud)
当我访问时程序的行为是否未定义x.a[10]?
我经常在我使用的一些代码库中发现这种模式:
std::map<std::string, std::string> mymap;
...
if (mymap.find(key) != mymap.end())
{
return mymap[key];
}
Run Code Online (Sandbox Code Playgroud)
我知道这可以替换为
std::map<std::string, std::string> mymap;
...
auto it = mymap.find(key)
if (it != mymap.end())
{
return it->second;
}
Run Code Online (Sandbox Code Playgroud)
但我想知道,在实践中,第一个版本是否会被优化以不搜索两次?
我正在编写一个套接字程序,但我输错了struct sockaddr_inas struct sockaddrr_in(注意一个额外的r),但我没有收到任何编译器错误,只有incompatible-pointer-types警告。
这是一个演示该问题的最小可重现程序。
#include <stdio.h>
struct Addr {
int flat_no;
};
struct Person {
struct Addr *address;
};
int main()
{
struct Person p;
struct Addr addr;
p.address = &addr;
struct Person *ptr = &p;
struct Addr *a = (struct Addrr *)ptr->address; // struct Addr mistyped as Addrr
printf("no error!!");
}
Run Code Online (Sandbox Code Playgroud)
和gcc都会clang产生此警告:
<source>:20:22: warning: initialization of 'struct Addr *' from incompatible pointer type 'struct Addrr *' [-Wincompatible-pointer-types] …Run Code Online (Sandbox Code Playgroud) 以下程序是否格式错误?如果是这样,这里进行诊断有什么问题吗?
template <typename T> struct A { int a{sizeof(T)}; };
int main() { sizeof(A<void>); }
Run Code Online (Sandbox Code Playgroud)
Clang 为该代码生成以下专业化 ( clang++ -std=c++20 -Xclang -ast-print -fsyntax-only main.cpp):
template <typename T> struct A {
int a {sizeof(T)};
};
template<> struct A<void> {
int a;
};
int main() {
sizeof(A<void>);
}
Run Code Online (Sandbox Code Playgroud) 我正在努力理解以下代码行:
if constexpr (std::is_same_v<T, bool>)
{
std::byte change = std::byte(static_cast<uint32_t>(in) << m_addr[1]);
std::byte mask = ~std::byte(1u << m_addr[1]);
dataBlock[m_addr[0]] = (dataBlock[m_addr[0]] & mask) | change;
}
Run Code Online (Sandbox Code Playgroud)
其中dataBlock是 a std::vector<std::byte>,T是in的类型,并且m_addr是 a std::array<std::byte, 2>。这会进行位移位以便将 bool 值存储在字节内。我的问题是关于声明中的第一行if。对于此示例,我将使用in = 1和m_addr[1] = 3。
根据我的理解,static_cast<uint32_t>(in)创建了一个uint32_t给定的00000000,00000000,00000000,00000001; 左移运算符将其转换为00000000,00000000,00000000,00001000,然后将其转换为std::byte。
如何std::byte选择存储的字节?我假设它存储 LSB,所以00001000,但我找不到任何参考资料来证实这一点。它可以存储MSB(所以00000000)吗?如果是,我怎样才能使下面的实现平台无关?
我有这样的课程:
struct InsertResult{
enum class Status{
INSERTED ,
UPDATED_IN_PLACE ,
REPLACED ,
SKIP_INSERTED ,
ERROR_NO_MEMORY ,
ERROR_INVALID ,
ERROR
};
bool ok;
Status status;
// more members here...
// spill the enum:
constexpr static auto INSERTED = Status::INSERTED ;
constexpr static auto UPDATED_IN_PLACE = Status::UPDATED_IN_PLACE ;
constexpr static auto REPLACED = Status::REPLACED ;
constexpr static auto SKIP_INSERTED = Status::SKIP_INSERTED ;
constexpr static auto ERROR_NO_MEMORY = Status::ERROR_NO_MEMORY ;
constexpr static auto ERROR_INVALID = Status::ERROR_INVALID ;
constexpr static auto ERROR = Status::ERROR …Run Code Online (Sandbox Code Playgroud)