gpt4 book ai didi

c++ - 概念中的隐式转换

转载 作者:行者123 更新时间:2023-12-05 03:16:49 26 4
gpt4 key购买 nike

考虑以下概念,它依赖于 operator bool() std::is_lvalue_reference<T> 的转换成员函数和 std::is_const<T> .

#include <type_traits>

template <typename T>
concept is_non_const_lvalue_reference =
std::is_lvalue_reference<T>{} && // Malformed for GCC 12.2 and MSVC 19.33
!std::is_const<std::remove_reference_t<T>>{};

static_assert(is_non_const_lvalue_reference<int&>);
static_assert(!is_non_const_lvalue_reference<int const&>);
static_assert(!is_non_const_lvalue_reference<int&&>);

请参阅 https://compiler-explorer.com/z/G5ffeWfbx 中的测试.

GCC 和 MSVC 都正确报告 std::is_lvalue_reference<T>{} 的返回类型不是 bool 值。但是 Clang 15 然后将隐式转换应用于 bool并认为上面的概念定义是合式的。相比之下,!std::is_const<...>{}由于 !,表达式被认为是 bool 表达式运营商。

问题:Clang 15 是否过于宽松地执行到 bool 的隐式转换? ?或者是 GCC 和 MSVC 的问题?也许它在 C++20 中未指定?

附言是的,我知道我可以替换 std::is_*<T>{}带有 std::is_*_v<T> 的表达式,从而避免了这个问题。但我想了解何时预期/允许执行隐式转换。

最佳答案

规则是,来自[temp.constr.atomic]/3 :

To determine if an atomic constraint is satisfied, the parameter mapping and template arguments are first substituted into its expression. If substitution results in an invalid type or expression, the constraint is not satisfied. Otherwise, the lvalue-to-rvalue conversion is performed if necessary, and E shall be a constant expression of type bool.

在这里,std::is_lvalue_reference<T>{}是一个原子约束 - 所以它的类型必须是 bool .它没有。

关于c++ - 概念中的隐式转换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/74451237/

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