gpt4 book ai didi

c++ - enable_if编译问题void = nullptr

转载 作者:行者123 更新时间:2023-12-01 12:13:26 25 4
gpt4 key购买 nike

有谁知道为什么分配type* = 0无效,而分配type* = nullptr无效呢?在这两种情况下typedef void type。谢谢

#include <type_traits>
#include <iostream>

template <class T,
typename std::enable_if<std::is_integral<T>::value>::type* = 0>
void do_stuff(T& t) {
std::cout << "do_stuff integral\n";
}

#if 0 // works
template <class T,
typename std::enable_if<std::is_integral<T>::value>::type* = nullptr>
void do_stuff(T& t) {
std::cout << "do_stuff integral\n";
}
#endif


struct S {};
int main(int argc, char *argv[])
{
int i = 1;
do_stuff(i);
return 0;
}
汇编:
clang++ -pedantic -Wall -std=c++11 test190.cc && ./a.out
test190.cc:23:5: error: no matching function for call to 'do_stuff'
do_stuff(i);
^~~~~~~~
test190.cc:6:6: note: candidate template ignored: substitution failure
[with T = int]: null non-type template argument must be cast to template
parameter type 'typename
std::enable_if<std::is_integral<int>::value>::type *' (aka 'void *')
void do_stuff(T& t) {
^
1 error generated.

最佳答案

从技术上讲,这是因为非类型模板参数必须是参数类型的“转换常量表达式”。这意味着参数本身必须是一个常量表达式,并且其对所需参数类型的转换必须仅使用[expr.const]/4中指定的转换。
根据[expr.const]/4,仅允许从std::nullptr_t进行空指针转换。换句话说,在转换后的常量表达式中,作为隐式转换序列的一部分,不允许从0到空指针值的转换。
但是,将static_cast<T*>(0)指定为T*类型的非类型模板参数的模板参数是完全合法的。换句话说,作为常量表达式的一部分,允许从0开始的空指针转换。只有在转换完成后的某个时刻(在计算完参数并将参数类型转换为参数类型时),标准才禁止这样做。
我不知道这条规则的理由。

关于c++ - enable_if编译问题void = nullptr,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63026319/

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