标签: c++20

std::coroutine_handle 线程安全吗?

std::coroutine_handle标准中是否有任何部分被定义为线程安全的?

例如,我可以看到std::coroutine_handle::done()使用原子变量来实现,这将允许在不首先锁定所有内容的情况下进行完成检查。

但是,如果标准中没有定义与线程安全相关的内容,那么我将不得不假设最坏的情况并始终锁定所有内容。

c++ c++20 c++-coroutine

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

c++20 将 chrono 类型转换为字符串

我试图将时间格式化为 hh::mm::ss 然后将其放入宽字符串流中。代码如下。


        std::chrono::steady_clock::time_point end = std::chrono::steady_clock::now();

        std::chrono::steady_clock::duration time_elapsed = end - start;

        std::chrono::hh_mm_ss formatted {std::chrono::duration_cast<std::chrono::milliseconds> (time_elapsed)};
Run Code Online (Sandbox Code Playgroud)

start位于类的构造函数中。使用<<流运算符不起作用,我没有看到任何方法将此类型转换为字符串。
我的问题是如何转换formatted为字符串(c 风格、wstring 或普通字符串)?

c++ c++-chrono c++20

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

C++20 中 constexpr 虚函数的优点是什么?

我可以很容易地说,通过将函数声明为constexpr,我们可以在编译时对其进行评估,这可以节省运行时的时间,因为结果已经生成了。

另一方面,虚函数需要在运行时解析。因此,我想我们无法摆脱解决过程。由于函数的机​​制,只能快速获取结果constexpr

函数还有其他好处吗constexpr virtual

c++ virtual-functions constexpr c++20 constexpr-function

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

GCC 中忽略默认成员值初始化

我在下面的代码中提出了一个意想不到的行为(据我自己有限的知识),它不尊重默认成员初始化值。我有一个单参数赋值的承包商,它应该从赋值运算符构建类。我忘记使用正确的参数名称,最终遇到了这个问题(请参阅带有故意错误的单参数构造函数的行:

为什么我得到垃圾值而不是成员初始化值?

我自己的假设是因为模板类,0与0.0不同......但尝试过并遇到了同样的问题。

#include <iostream>
#include <concepts>


template <class T>
requires std::is_arithmetic_v<T>
class Complex
{
private:
    T re = 0;
    T im = 0;

public:

    Complex() {
        std::cout << "Complex: Default constructor" << std::endl;
    };

    Complex(T real) : re{re} { // should be re{real}, but why re{re} is not 0?
        std::cout << "Complex: Constructing from assignement!" << std::endl;
    };

    void setReal(T t) {
        re = t;
    }

    void setImag(const T& t) {
        im = t;
    } …
Run Code Online (Sandbox Code Playgroud)

c++ templates c++20

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

如何将 int 转换为 string 然后与 std::ranges::views 连接?

#include <iostream>
#include <numeric>
#include <ranges>
#include <vector>
#include <string>
#include <string_view>

int main() {
    auto str = (
        std::views::iota(1)
        | std::ranges::views::take(5)
        | std::ranges::views::transform([](int x) -> std::string_view {
            return std::to_string(x) + "|";
        })
        | std::ranges::views::join
    );

    for (const char ch : str) {
        std::cout << ch;
    }

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

我是 cpp 函数式编程的新手。我想生成前五个自然数并将它们转换为字符串,然后连接它们并打印它。

如果我使用std::stringlambda 的返回类型进行转换,它会在编译时引发许多错误。我想我应该把它改成std::string_view. 我这样改了,编译没有编译错误。但是,如果我std::string_view在那里使用,lambda 函数仅返回字符串的引用,并且当 lambda 结束时,堆栈内存上的翻译字符串将被从内存中删除。因此,该程序不会打印任何内容。

我该如何修复它?

c++ c++20 std-ranges

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

是否允许使用新定义扩展 std::numbers 命名空间?

我在大型代码库中定义了几个数学数字常量。其中几个(但不是全部)现在在新的 C++20<numbers>标头中重复。我想把它们都集中在一处;是否允许扩展std::numbers标头以包含尚未定义的标头?

c++ namespaces std c++20

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

无法在没有读访问冲突的情况下删除数组

我最近想用 C++ 制作一个快速模拟器,而不使用 C++(允许使用 C)标准库功能。因此,我使用原始指针数组来存储模拟器的内存。但是,我在将内存类移动到另一个内存类时遇到了读取访问冲突。欢迎所有建议。

内存等级:

#ifndef MEM_HPP
#define MEM_HPP

#include <cstdint>
#include <cstddef>

namespace handle {
    using num = std::uint8_t;
    using size = std::size_t;
    struct memory {
        enum { EIGHT_BIT_MAX_MEM = 256, SIXTEEN_BIT_MAX_MEM = 65536 };
        constexpr explicit memory(size max_mem) : mem_size(max_mem) {
            mem = new num[max_mem];
        }
        constexpr memory(memory&& other) noexcept {
            delete[] mem;
            mem = other.mem;
            mem_size = other.mem_size;
            other.mem = nullptr;
            other.mem_size = 0;
        }
        constexpr memory(const memory& other) = delete;
        constexpr ~memory() {
            delete[] mem; …
Run Code Online (Sandbox Code Playgroud)

c++ runtime-error c++20

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

在推导函数参数时是否需要考虑隐式用户定义转换运算符() 的解决方法?

考虑以下示例,它尝试将 a 传递std::array给函数。当然不考虑“转换”,但是有没有不需要明确的解决方法?特别是如果该类已经提供了必要的属性(value_type 等)。

template <typename T, size_t N>
struct Array_t
{
    using value_type = T;
    using size_type = size_t;

    std::array<T, N> Internal{};

    constexpr operator auto() { return Internal; }
};

template <typename T, size_t N> constexpr bool Test(std::array<T, N> Input)
{
    return Input.size() == 32;
}

constexpr std::array<uint8_t, 32> OK1 = Array_t<uint8_t, 32>();
constexpr auto OK2 = Test((std::array<uint8_t, 32>)Array_t<uint8_t, 32>{});
constexpr auto OK3 = Test(Array_t<uint8_t, 32>().Internal);

// could not deduce template argument for 'std::array<_Ty,_Size>'
// from 'Array_t<uint8_t,32>' …
Run Code Online (Sandbox Code Playgroud)

c++ templates types c++20

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

如何检查有符号的返回类型?

想象一下我有一个可调用的模板参数“Fn fn”。现在我想检查它的返回类型是否是有符号标量。我如何使用 C++20 概念做到这一点?

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

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

概念:需要类型上的函数,而不默认构造该类型

我需要要求某种类型 A 存在一个函数 f(A, A::B)。

我正在通过使用 A 和 A::B 的实例调用 f 来测试这一点。是否有一种不那么招摇的方法来测试依赖类型的实例而不需要默认可构造?

template <class Container>
concept CanPutData = requires (Container a)
{
  //put(typename Container::data_type{}, a);  // overconstrained
  put(*reinterpret_cast<typename Container::data_type*>(0), a); // oof
};

void test(CanPutData auto container) {}

template<class Container>
void put(typename Container::data_type const& data, Container& into) {}


template<class Data>
struct data_container { using data_type = Data; };
struct not_default_constructible_data { int& v; };

int main()
{
  test(data_container<not_default_constructible_data>{});

  return 0;
}

Run Code Online (Sandbox Code Playgroud)

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

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