【发布时间】:2012-05-02 16:03:24
【问题描述】:
有没有办法实现字符串在编译时和运行时都可以工作?
AFAIK 对于要构造的 constexpr 类,它需要有一个微不足道的析构函数。然而,当我们处理字符串时,这被证明是困难的。如果字符串不是 constexpr,那么它需要释放内存。但是,如果它是 constexpr,那么它是静态分配的,不应该被删除,从而允许一个微不足道的析构函数。
但是,不可能说“嘿,编译器!如果我是 constexpr,你就不需要破坏我!”还是这样?
应该是这样的:
class string {
private:
char * str;
public:
template<std::size_t l>
constexpr string(const char (&s)[l]) : str(&(s[0])) {}
string(const char * s) { str = strdup(s); }
static if (object_is_constexpr) {
~string() = default;
}
else {
~string() { free(str); }
}
};
我能做到的最接近的是有两种不同的类型,string 和 constexpr_string,一个用户定义的文字 _string 返回 constexpr_string,以及一个用户定义的从 constexpr_string 到 string 的隐式转换。
这不是很好,因为const auto s = "asdf"_string; 有效,但const string s = "asdf"_string; 无效。此外,指向 constexpr_string 的引用/指针不会转换。任何一种方式的继承都会导致不直观的“陷阱”,并且不能解决第一个问题。
这似乎应该是可能的,只要编译器相信程序员不需要破坏 constexpr。
如果我有任何误解,请告诉我。
【问题讨论】:
-
我想你正在寻找来自akrzemi1.wordpress.com/2011/05/11/…的
strwrap -
String Literals
const char (&Var)[N]是constexpr字符串类型。 -
当人们在获得批准之前就开始使用
static if等功能时,您一定会喜欢上它们! -
@David:如果人们还没有尝试使用某个功能,我就不会批准它。此类功能的技术术语是“无用”;-)
-
@SteveJessop:嗯,提案和语言有很多粗糙的角落,首先是它如何与两阶段查找交互(这在 D 中不是问题)。再说一次,有一些被接受的提议没有被使用(考虑右值引用),但显然是一种改进。 有一个实现和用例和它在 SO 中使用之间有很大的区别。另请注意,这不是批评,而是对提案的赞扬:人们在听到这个概念后就开始使用它已经足够了!