gpt4 book ai didi

c++ - 数组到指针类模板参数推导适用于模板指南,但不适用于非模板版本,这是正确的还是错误?

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:57:26 25 4
gpt4 key购买 nike

我有带有单一类型参数和 const char* 类型完全特化的类模板,下面的简化示例:

template <typename T>
struct PrettyPrint {
PrettyPrint(const T& value) : value(value) {}
const T& value;
friend std::ostream& operator << (std::ostream& os, const PrettyPrint& pp) {
return os << "(" << pp.value << ")";
}
};
template <>
struct PrettyPrint<const char*> {
PrettyPrint(const char* value) : value(value) {}
const char* value;
friend std::ostream& operator << (std::ostream& os, const PrettyPrint& pp) {
return os << "\"" << pp.value << "\"";
}
};

简而言之 - 打印像 "abc" 这样的字符字符串和像 (123) 这样的所有其他值("" vs ())

因此,我添加了一个推导指南,作为对所有 char[N] 类型的额外部分特化的替代:

template <std::size_t N>
PrettyPrint(char(&)[N]) -> PrettyPrint<const char*>; //deduction guide

不幸的是它不起作用:

 std::cout << PrettyPrint(7) << PrettyPrint("aaa") << PrettyPrint((const char*)"bbb");

(7)(aaa)"bbb"

预期输出:

(7)"aaa""bbb"

但是,令人惊讶的是,这有效:

template <typename T, std::size_t N>
PrettyPrinter(T(&)[N]) -> PrettyPrinter<const T*>; //deduction guide

std::cout << PrettyPrint(7) << PrettyPrint("aaa") << PrettyPrint((const char*)"bbb");

(7)"aaa""bbb"

所以问题:

  1. 这是正确的吗(然后为什么)或者这是编译器中的错误(使用 gcc/clang 测试 - 最新版本)
  2. 如果那是正确的 - 那么如何将此模板推导指南限制为仅 char

最佳答案

这是预料之中的。字符串文字的类型为 const char[N]。注意 const。 const 值不能绑定(bind)到非 const 引用,因此您的推导指南实际上未被选择,而是主模板被实例化。

template <std::size_t N>
PrettyPrint(const char(&)[N]) -> PrettyPrint<const char*>;

您的第二个推导指南有效,因为在这里,T 被推导为 const char,这非常好。

关于c++ - 数组到指针类模板参数推导适用于模板指南,但不适用于非模板版本,这是正确的还是错误?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50607815/

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