C++ C++;11 constexpr字符串实现

C++ C++;11 constexpr字符串实现,c++,c++11,constexpr,C++,C++11,Constexpr,有没有一种方法可以实现字符串在编译时和运行时都工作 对于要构造constexpr的类,它需要一个平凡的析构函数。然而,当我们处理字符串时,这被证明是困难的。如果字符串不是constexpr,则需要释放内存。但是,如果它是constexpr,那么它是静态分配的,不应该被删除,从而允许使用一个简单的析构函数 但是,不可能说“嘿,编译器!如果我是constexpr,你就不需要破坏我!”或者是这样吗 它将类似于以下内容: class string { private: char * str; p

有没有一种方法可以实现字符串在编译时和运行时都工作

对于要构造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); }
    }
};
类字符串{
私人:
char*str;
公众:
模板
constexpr字符串(constchar&s[l]):str(&(s[0])){}
字符串(常量字符*s){str=strdup(s);}
静态if(对象是constexpr){
~string()=默认值;
}
否则{
~string(){free(str);}
}
};
我能找到的最接近的是两种不同的类型,string和constexpr\u string,一种返回constexpr\u string的用户定义文字字符串,以及一种从constexpr\u string到string的用户定义隐式转换

但是这不是很好,因为
const auto s=“asdf”\u字符串工作,但
常量字符串s=“asdf”\u字符串没有。此外,指向constexpr\u字符串的引用/指针不会转换。无论哪种方式,继承都会导致不直观的“gotcha”,并且不能解决第一个问题

这似乎是可能的,只要编译器相信程序员不需要销毁constexpr


如果我有误解,请告诉我。

这不仅仅是破坏问题

constepr
操作应该只调用其他
constepr
操作和
new
malloc
等。。。不是
constexpr
。请注意,这是一个静态检查的属性,不依赖于运行时参数,因此对此类函数的调用必须完全不存在,而不仅仅隐藏在(假定)未执行的分支中


因此,永远不可能获得
constepr
字符串

在某种程度上,请参阅。您可以创建constexpr
conststr
对象并对其调用一些操作,但不能将它们用作非类型模板参数。

我认为您正在从字符串文本
const char(&Var)[N]中查找
strwrap
constepr
字符串类型。当人们在获得批准之前开始使用
static if
等功能时,你一定会喜欢的@大卫:就我个人而言,如果人们还没有尝试使用某个功能,我就不会批准它。这些特性的技术术语是“无用的”;-)@SteveJessop:提案和语言有很多粗糙的地方,第一个是它如何与两阶段查找交互(这在D中不是问题)。此外,还有一些被接受的建议没有被使用(考虑右值引用),但显然是一种改进。拥有一个实现和用例与在SO中使用它之间有很大的区别。还要注意的是,这不是批评,而是对提议的赞扬:人们在听到这个概念后就开始使用它已经足够好了!它甚至不能在非constexpr构造函数中?对于给定类型,似乎应该可以同时使用constexpr和non-constexpr构造函数,就像可以使用const和non-const方法一样。您完全可以创建
constexpr
字符串类型,但它无法处理非constexpr字符串。我认为,constexpr是一种模糊编译时和运行时计算之间界限的方法。基本类型允许这样做,而且似乎应该可以做一些事情来允许类中的指针指向文本或动态分配的内存。函数式语言在编译时/运行时边界上进行抽象已有相当一段时间了@mooingduck:转换函数似乎打破了abstraction@RobertMason:堆高度依赖运行时(且有状态),无法在编译时执行。时期您所能做的最好的事情就是在启动时运行时执行。“您完全可以创建一个constexpr字符串类型,它将无法处理非constexpr字符串。”。那根本不是真的。不拥有运行时字符串类是完全可行的。又名stringref。