- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
以下代码要求在gcc中的std::decay
中使用noexcept operator
,但在clang中不使用。
template<typename... Ts>
class B;
template<typename T>
class B<T> {
T t;
public:
template<typename U>
constexpr B(U&& t)
// without decay - strange behavior in gcc, see main below <===
noexcept(noexcept(T{std::forward<U>(t)}))
// if adding decay - all cases in main are ok with both gcc and clang
// noexcept(noexcept(std::decay_t<T>{std::forward<U>(t)}))
: t(std::forward<U>(t)) {}
};
template<typename T, typename... Ts>
class B<T, Ts...>: protected B<Ts...> {
public:
template<typename U, typename... Us>
constexpr B(U&& t, Us&&... ts)
: B<Ts...>{std::forward<Us>(ts)...} {}
};
template<typename... Ts>
constexpr auto create(Ts&&... ts) {
return B<Ts...>{std::forward<Ts>(ts)...};
}
template<typename... Ts>
B(Ts...) -> B<Ts...>;
主要
int main() {
// ok in both gcc and clang:
// [1] the "hello" parameter is not last
auto b1 = create("hello", 1);
auto b2 = create(1, "hello", 5);
// [2] passing it directly to the ctor of B
B b3(1, "hello");
// fails with gcc when the noexcept doesn't use decay
// but only if "hello" is the last argument and passed via a function
auto b4 = create(1, "hello");
auto b5 = create("hello");
}
gcc的编译错误是:
<source>:13:40: error: invalid conversion from 'const char*' to 'char'
[-fpermissive]
13 | noexcept(noexcept(T{std::forward<U>(t)}))
| ~~~~~~~~~~~~~~~^~~
| |
| const char*
代码:
https://godbolt.org/z/s7rf64
std::decay
?
最佳答案
在@Marek R发表评论之后,这似乎是gcc中的错误。
A bug was opened on gcc。
以下情况对于gcc而非clang也失败:
template<typename T, typename U>
auto convert(U&& t) {
// fails on gcc:
return T{std::forward<U>(t)};
// works ok if it is not brace initialization:
// return T(std::forward<U>(t));
}
template<std::size_t INDEX, typename T, typename U, typename... Us>
auto convert(U&& t, Us&&... ts) {
if constexpr(INDEX == 0) {
return convert<U>(t);
// works well if we add decay
// return convert<std::decay_t<U>>(t);
}
else {
return convert<INDEX-1, T>(ts...);
}
}
int main() {
// fails with gcc
auto p = convert<1, const char*>(1, "hello");
}
代码:
https://godbolt.org/z/jqxbfj
关于c++ - 是否需要在noexcept运算符中进行std::decay?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63740618/
以下代码要求在gcc中的std::decay中使用noexcept operator,但在clang中不使用。 template class B; template class B { T t
这是 this question 的跟进. 我有一个带有模板模板参数的模板化类型 template class CONTAINER, typename NUMBERTYPE> struct spam
我们知道一个看起来像 void() 的参数将被重写为 void(*)()。这类似于数组到指针的衰减,其中 int[] 变为 int*。在很多情况下,使用数组会将其衰减为指针。除了参数之外,还有没有函数
我是概念新手。据我了解the concept library列出所有可用的标准概念。然而,似乎没有像 std::decay 这样的东西?比较以下一般用例,我想将方法的输入限制为类专门化类型: De
我是概念新手。据我了解the concept library列出所有可用的标准概念。然而,似乎没有像 std::decay 这样的东西?比较以下一般用例,我想将方法的输入限制为类专门化类型: De
假设我在 SQL 数据库中有几行信息。我希望自动删除超过 30 天的信息行。 这可能吗? 附加信息: 我正在使用提供的 SQL 日期函数来收集日期。 最佳答案 这个问题有两个方面: 如何安排 实际的
我是C++的新手,做了一个测试程序来了解更多关于decltype的信息, std::decay , std::is_same_v (特征)还有typeid . 我有以下简单类,我想在其中获取模板参数类
N4296 中std::decay 的规范留下以下注释: [ Note: This behavior is similar to the lvalue-to-rvalue (4.1), array-t
我正在处理一些遗留的 C 结构——我们有零长度数组。我认为这是无效的,但我们必须忍受它。我正在编写一个宏,我想使用 std::decay 将数组衰减为指针类型。 但是如果我有一个零长度数组 - str
我创建这些类型特征是为了确定类型是否是动态容器,但最近在对 vector 的引用未返回 true 时遇到了困惑。 template struct is_dynamic_container {
我写了 cumsum 的变体函数,在添加当前值之前,我将先前的总和乘以衰减因子: decay <- function(x, decay=0.5){ for (i in 2:length(x)){
我有一个表示数组引用的类 (class array_ref) 和另一个是(即持有/拥有/包含)数组(class array)。array_ref 的行为类似于引用。 将 std::decay 特化为
std::decay 的这个实现是否正确? template T DecayType(T); template struct decay { using type = decltype(Dec
std::decay存在的原因是什么? ?在什么情况下是std::decay有用吗? 最佳答案 明显是用来衰变放射性的std::atomic类型为非放射性的。 N2609是提出 std::decay
std::decay存在的原因是什么? ?std::decay在什么情况下有用吗? 最佳答案 显然是用来衰变放射性的std::atomic类型为非放射性的。 N2609是提出 std::decay 的
我正在阅读有关 ElasticSearch 中的衰减函数的内容,以推广更新的结果 如果我将衰减函数定义如下: "DECAY_FUNCTION": { "FIELD_NAME": {
我试图更好地理解 std::decay 的工作原理。根据 cppreference ,它应该从类型中删除 const 和 volatile 分类,作为它所做的其他转换的一部分。然而,下面的函数显示“F
这个问题在这里已经有了答案: When a function has a specific-size array parameter, why is it replaced with a point
template struct decay { using type = R(*)(A..., ...); }; 它的确切含义是什么?我需要一些帮助~ 最佳答案 int foo(int); int
std::remove_cvref 会在 C++20 之后替换 std::decay 吗? 来自 this link ,我不明白这是什么意思: C++20 will have a new trait
我是一名优秀的程序员,十分优秀!