gpt4 book ai didi

c++ - 是否需要在noexcept运算符中进行std::decay?

转载 作者:行者123 更新时间:2023-12-02 10:27:23 30 4
gpt4 key购买 nike

以下代码要求在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
对这种奇怪的行为有任何想法吗?它是gcc错误吗?还是确实需要 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/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com