小编And*_*zos的帖子

使用 C++20 中的给定键读取/写入 std::multimap 的所有值?

假设我有一些功能:

void mutate(V& v);
Run Code Online (Sandbox Code Playgroud)

读/写v- 我想写一个函数:

void mutate_map_values(std::multimap<K,V>& m, K k);
Run Code Online (Sandbox Code Playgroud)

这适用mutatem具有 key 的所有值k

mutate_map_values在 C++20 中最简洁的实现方式是什么?

c++ c++20

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

如何在 constexpr if-else 链中导致静态错误?

在以下 C++20 函数模板中:

template<int i>
void f() {
    if constexpr (i == 1)
       g();
    else if constexpr (i == 2)
       h();
    else
       ??? // <--error
}
Run Code Online (Sandbox Code Playgroud)

有什么我们可以写的东西,???这样f<3>()在编译时调用就会失败?

c++ static-assert constexpr c++20 if-constexpr

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

std::index_sequence_for 作为默认参数的问题?

以下 C++20 程序:

#include <utility>
#include <cstddef>

template<typename... Args>
class C {
    template<size_t... I>
    static void call(
      std::index_sequence<I...> = std::index_sequence_for<Args...>{}
    ) {}
};

int main() {
    C<long int>::call();
}
Run Code Online (Sandbox Code Playgroud)

无法编译并显示错误消息:

test.cc: In static member function ‘static void C<Args>::call(std::index_sequence<I ...>) [with long unsigned int ...I = {}; Args = {long int}; std::index_sequence<I ...> = std::integer_sequence<long unsigned int>]’:
test.cc:11:20: error: could not convert ‘std::index_sequence_for<long int>{}’ from ‘integer_sequence<[...],#‘nontype_argument_pack’ not supported by dump_expr#<expression error>>’ to ‘integer_sequence<[...],#‘nontype_argument_pack’ not supported by dump_expr#<expression error>>’
   11 |  C<long …
Run Code Online (Sandbox Code Playgroud)

c++ c++20

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

数组下标的类型`int [int]'无效

我正在尝试编译下一个代码,但我在指定的行上收到此错误

"数组下标的类型`int [int]'无效"

码:

template<typename T>
class Stack {
      private:
              static const int GROW_FACTOR = 2;
              static const int START_LENGHT = 10;

              T * data;
              int max;
              int used;

              void allocateIfNeeded() {
                   if (used == max) {
                      T * aux = new T[max*GROW_FACTOR];
                      for (int i=0; i<max; i++) {
                          aux[i] = data[i];
                      }
                      max *= GROW_FACTOR;
                      delete[] data;
                      data = aux;
                   }
              }
      public:
             Stack() {    
                 max = START_LENGHT;
                 data = new T[max];
                 used = 0;
             }

             void push(T data) …
Run Code Online (Sandbox Code Playgroud)

c++ arrays templates subscript

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

2012年1月C++ 11工作草案"源"格式?

2012年1月的C++标准工作草案以PDF格式提供:

http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2012/n3337.pdf

是否公开知道使用哪种源格式和流程/工具来生成此PDF?

这些源文件是否也公开发布?

文档内容是否以PDF以外的任何其他格式提供?

c++ c++11

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

确定参数的数量和类型以及作为函数的类型参数的返回类型

给定C++ 11函数:

X f(A, B, C);
Run Code Online (Sandbox Code Playgroud)

无论如何,从这个功能:

template<typename T>
void g(T t)
{
    ...
}
Run Code Online (Sandbox Code Playgroud)

称如下:

g(f);
Run Code Online (Sandbox Code Playgroud)

确定:

  • f的参数个数
  • f的参数i的类型
  • f的返回类型

...

template<typename F>
void g(F f)
{
    constexpr size_t n = num_params<F>::n; // 3
    return_type<F>::type x; // X
    tuple<param_types<F>::type...> a; // tuple<A, B, C>
}
Run Code Online (Sandbox Code Playgroud)

c++ c++11

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

在构造函数成员初始化器中抛出C++异常?

考虑以下情况:

struct X { ... };

struct Y
{
     Y(...);

     ...

     X x;

     ...
}

X f()
{
    ...

    if (...)
        throw E;

    ...
}

Y::Y(...) :
    ... ,
    x(f()) ,
    ...
{
    ...
}
Run Code Online (Sandbox Code Playgroud)

这里有任何未定义的行为吗?当抛出E时,这种设计是否存在任何问题或潜在问题?

更新:

Y::x可能不是Y该类的唯一成员变量,可能不是该类中的第一个成员变量,并且可能在初始化Y::Y列表中途初始化.

c++ constructor exception c++11

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

从默认参数中推导模板参数

为什么这个C++ 11程序不起作用:

template <typename T>
void f(T t = 42) {}

int main() { f(); }
Run Code Online (Sandbox Code Playgroud)

为什么不能T从默认参数中推断出来42

c++ c++11

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

将参数移到std :: thread中?

请考虑以下代码:

void h(M m2) 
{ 
    ...
}

int main()
{
  while (true) {
    M m1 = ...;
    std::thread t(h, std::move(m1));
    t.detach();
  }
}
Run Code Online (Sandbox Code Playgroud)

是否可以保证-d从之前构造的m2正确被销毁?还是有种族?movem1m1

c++ multithreading thread-safety c++11 c++14

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

如何将 std::set_terminate 与 SetUnhandledExceptionFilter 一起使用?

有什么方法可以获取.what()未捕获的 C++ 异常,同时还安装了 Windows 未处理的异常过滤器?

为了演示,以下程序...

#include <windows.h>
#include <iostream>

static LONG WINAPI WindowsExceptionHandler(LPEXCEPTION_POINTERS ep) {
    std::cerr << "FOO" << std::endl;
    return EXCEPTION_EXECUTE_HANDLER;
}

void TerminateHandler() {
    std::exception_ptr exception_ptr = std::current_exception();
    try {
        if (exception_ptr) std::rethrow_exception(exception_ptr);
    } catch (const std::exception& e) {
        std::cerr << e.what() << std::endl;
    }
}

int main() {
    SetUnhandledExceptionFilter(WindowsExceptionHandler);
    std::set_terminate(TerminateHandler);
    throw std::runtime_error("BAR");
}
Run Code Online (Sandbox Code Playgroud)

输出:

FOO
Run Code Online (Sandbox Code Playgroud)

我希望它输出BAR或者FOOBAR

注释掉SetUnhandledExceptionFilter使其工作(但这是不可接受的,因为它不会捕获其他 Windows 异常类型)。

显然以某种方式SetUnhandledExceptionFilter覆盖std::set_terminate

c++ windows winapi c++17

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