假设我有一些功能:
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)
这适用mutate于m具有 key 的所有值k。
mutate_map_values在 C++20 中最简洁的实现方式是什么?
在以下 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++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) 我正在尝试编译下一个代码,但我在指定的行上收到此错误
"数组下标的类型`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) 2012年1月的C++标准工作草案以PDF格式提供:
http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2012/n3337.pdf
是否公开知道使用哪种源格式和流程/工具来生成此PDF?
这些源文件是否也公开发布?
文档内容是否以PDF以外的任何其他格式提供?
给定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)
确定:
...
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)
?
考虑以下情况:
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++ 11程序不起作用:
template <typename T>
void f(T t = 42) {}
int main() { f(); }
Run Code Online (Sandbox Code Playgroud)
为什么不能T从默认参数中推断出来42?
请考虑以下代码:
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
有什么方法可以获取.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?