- 已关闭**。此问题需要details or clarity。当前不接受答案。
- 想要改进此问题?**添加详细信息并通过editing this post阐明问题。
14小时前关门了。
Improve this question
考虑具有两个构造函数的BasicCharp类:
template <class CharType>
class BasicCharp {
public:
using value_type = CharType;
using pointer = value_type*;
public:
//1
template<size_t SIZE>
constexpr BasicCharp(value_type (&str)[SIZE]) noexcept
: m_Length(SIZE)
, m_String(str) {}
//2
constexpr BasicCharp(pointer string) noexcept
: m_Length(countElems(string))
, m_String(string) {}
private:
size_t m_Length;
pointer m_String;
};
施工:
BasicCharp<const char> str = "test";
它调用构造函数2,但是如果没有构造函数2,它调用构造函数1。
如何保留构造函数2,但如果可能的话强制使用构造函数1?
一个c++17的解决方案是首选,但任何标准的是受欢迎的。
目标是在编译时推断字符串字面量的大小,但如果传递了一个指针,则大小应由构造函数计算。
3条答案
按热度按时间2w3kk1z51#
重载不明确;衰减的数组指针并不比未衰减的指针更好或更差。2它只是因为非模板重载比模板重载匹配得更好才编译。
您可以做的是使指针重载成为更差的重载候选对象,例如,通过引入用户定义的转换序列。
lfapxunr2#
不完全相同,但您可以标记dispatch,如下所示:
zdwk9cvp3#
你可以将结果赋给constexpr变量,但不能100%保证这会在编译时完成,你也可以使用consteval,在这种情况下,如果变量没有在编译时赋值,你会得到错误(consteval在c++20下工作)