在GCC12 的发行说明中,“运行时库 (libstdc++) ”部分下写道:
改进了实验性 C++23 支持,包括:[...] <stacktrace>(默认情况下未构建,需要链接到额外的库)。
我需要链接哪个库才能使用<stacktrace>?我使用的是 x86 Linux 系统,如果这很重要的话。
我想定义一个通用的强别名类型,即一个类型
template<typename T, auto ID = 0>
class StrongAlias {
T value;
};
Run Code Online (Sandbox Code Playgroud)
这样,对于类型Ta StrongAlias<T>可以以完全相同的方式使用T,但是StrongAlias<T, 0>并且StrongAlias<T, 1>是不能实现地相互转换的不同类型.为了T尽可能完美地模仿a ,我希望我StrongAlias拥有与之相同的构造函数T.这意味着我想做类似以下的事情:
template<typename T, auto ID = 0>
class StrongAlias {
T value;
public:
// doesn't work
template<typename... Args, typename = std::enable_if_t<std::is_constructible_v<T, Args...>>>
StrongAlias(Args&&... args) noexcept(std::is_nothrow_constructible_v<T, Args...>)
: value(std::forward<Args>(args)...) {}
};
Run Code Online (Sandbox Code Playgroud)
template parameter pack must be the last template parameter因为clang 5.0会告诉我,因为这不会起作用.我想到的另一种使用SFINAE的方法是返回类型,但由于构造函数没有返回类型,所以这似乎也不起作用.
有没有办法在构造函数中的可变参数模板参数包上使用SFINAE?
或者,如果没有,我可以用另一种方式完成我想要的吗?
请注意,T在我的情况下,从a中隐式构造是不够的,如show 的例子StrongAlias<std::optional<int>> …
在不借助 boost.iterator 等库的帮助下创建 C++20 之前的新迭代器时,有必要指定类型别名difference_type、value_type、pointer和。
根据cppreference ,对于 C++20,只需要指定和referenceiterator_categorydifference_typevalue_type这很棒!但是为什么这 3 个别名有默认值呢?
有两件事我不明白(其中一件事在我看来像是一个疏忽):
value_type为什么和没有默认值difference_type?使用类似的东西std::remove_reference_t<reference>作为默认值难道没有意义吗value_type?作为随机访问迭代器的默认设置difference_type,使用采用两个迭代器的运算符的结果类型可以说是有意义的-。contiguous_iterator_tag. 就像与input_iterator_tagvsforward_iterator_tag一样,我不明白编译器如何正确区分连续迭代器和随机访问迭代器,我想这就是它显然从不选择的原因contiguous_iterator_tag。这是故意的吗?将输入迭代器错误分类为前向迭代器似乎也有些危险,那么为什么不要求程序员自己指定此别名呢?iterator_category程序员已经明确声明了另一个类别,但默默地生成一个值是否是一个好主意,并且为iterator_category它生成一个与看起来完全不同的值concept也很奇怪。考虑这个不切实际的例子:#include <iostream>
#include <iterator>
// With the == operator, this is an input iterator, but nothing else.
struct WeirdIterator {
// Not an output iterator because …Run Code Online (Sandbox Code Playgroud)