小编Dai*_*ner的帖子

如何确保类型安全的字符串初始化?

我该如何让这段代码无法编译?

std::string foo;
foo = 3;
Run Code Online (Sandbox Code Playgroud)

我知道它int可以转换为char(恕我直言,一个错误。谢谢,C),并且std::string有一个char赋值运算符(恕我直言,也是一个错误)。

c++ string std type-conversion

5
推荐指数
0
解决办法
123
查看次数

std::make_shared() 的智能感知如何知道默认构造函数参数?是 Visual Studio 还是 C++?如果是C++我自己怎么实现

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() 的智能感知的样子

这是我的示例的样子我的示例的智能感知

c++ templates constructor visual-studio c++14

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

为什么 std::array 需要大小作为模板参数而不是构造函数参数?

我发现了很多设计问题,特别是传递std::array<>给函数时。基本上,当您初始化 std::array 时,它会接受两个模板参数<class Tsize_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<>要以这种方式设计的问题。

c++ std c++11 stdarray

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

如何使用概念检查类型中是否存在类型别名

有没有办法要求给定类型在其中定义类型别名?例如,我如何编写一个概念来检查这是否有效,其中该概念检查类型 T 是否具有类型别名Bar

template <typename T>
concept HasBarType = ????;

template <HasBarType T>
void foo() {
    [[maybe_unused]] T::Bar bar;
}
Run Code Online (Sandbox Code Playgroud)

c++ c++-concepts c++20

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

如果我知道访问地址上有哪些数据,那么越界访问数组是否是未定义的行为?

想象一下下面的定义。

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]

c++ stack undefined-behavior

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

是否首先使用 std::map::find 进行搜索,然后使用 [] 来检索值,通常是优化的吗?

我经常在我使用的一些代码库中发现这种模式:

   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)

但我想知道,在实践中,第一个版本是否会被优化以不搜索两次?

c++ search stdmap

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

将指针类型转换为未定义类型不会产生编译器错误

我正在编写一个套接字程序,但我输错了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)

c pointers casting compiler-errors

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

具有不完整类型的类模板实例化

以下程序是否格式错误?如果是这样,这里进行诊断有什么问题吗?

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)

c++ templates

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

std::byte 构造函数是否从整数中提取 LSB 或 MSB?

我正在努力理解以下代码行:

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>Tin的类型,并且m_addr是 a std::array<std::byte, 2>。这会进行位移位以便将 bool 值存储在字节内。我的问题是关于声明中的第一行if。对于此示例,我将使用in = 1m_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)吗?如果是,我怎样才能使下面的实现平台无关?

c++ c++17 std-byte

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

DRY:C++11 枚举类与 C 枚举

我有这样的课程:

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)

c++ dry enum-class c++17

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