::value, "T cannot be compared to nullptr-6ren">
gpt4 book ai didi

c++ - 该语句如何检查 "T cannot be compared to nullptr"?

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

static_assert(
std::is_convertible<decltype(std::declval<T>() != nullptr), bool>::value,
"T cannot be compared to nullptr.");
来源: https://github.com/microsoft/GSL/blob/master/include/gsl/pointers
具体来说:
  • decltype(std::declval<T>() != nullptr)的结果是什么?是,如果 T 真的不能与 nullptr 相比?
  • 我可以更换!===这里?
  • 我可以更换std::is_convertiblestd::is_same这里?
  • 最佳答案

    T无法与 nullptr 相比,整个事情是不正确的。
    https://godbolt.org/z/eqehez

    #include <type_traits>

    template<typename T>
    void foo()
    {
    static_assert(
    std::is_convertible<decltype(std::declval<T>() != nullptr), bool>::value,
    "T cannot be compared to nullptr.");
    }

    int main()
    {
    foo<int>();
    }
    这会导致使用 M​​icrosoft 自己的编译器进行编译器诊断,而不是断言:
    example.cpp
    <source>(7): error C2446: '!=': no conversion from 'nullptr' to 'T'
    with
    [
    T=int
    ]
    <source>(7): note: A native nullptr can only be converted to bool or, using reinterpret_cast, to an integral type
    <source>(13): note: see reference to function template instantiation 'void foo<int>(void)' being compiled
    <source>(7): error C2955: 'std::is_convertible': use of class template requires template argument list
    C:/data/msvc/14.28.29333/include\type_traits(354): note: see declaration of 'std::is_convertible'
    <source>(7): error C2057: expected constant expression
    Compiler returned: 2
    是否使用都没关系 !===这里。是否可以使用 is_same是一个有争议的问题。这似乎回答了您提出的问题。本 static_assert的总体目的有点不清楚。一闪而过的想法是,这可能偶尔会遇到一些邪恶的 T重载 ==!=比较运算符 Tstd::nullptr_t ,然后返回除 bool 以外的其他内容.这有点牵强,但也是可能的。我查看了那个 github 存储库,但似乎并非如此。我认为这个测试被打破了。

    关于c++ - 该语句如何检查 "T cannot be compared to nullptr"?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65867007/

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