在 C++ 中是不是可以强制执行字符串文字函数参数?
Posted
技术标签:
【中文标题】在 C++ 中是不是可以强制执行字符串文字函数参数?【英文标题】:Is it possible in C++ to enforce a string-literal function argument?在 C++ 中是否可以强制执行字符串文字函数参数? 【发布时间】:2021-11-06 11:31:42 【问题描述】:我想知道是否可以在 C++ 中声明一个必须是字符串文字的函数参数?我的目标是接收一个我只能保留指针的对象,并且知道它不会从我下面被free()
ed (即具有应用程序生命周期范围)。
例如,假设我有类似的东西:
#include <string.h>
struct Example
Example(const char *s) : string(s)
const char *string;
;
void f()
char *freeableFoo = strdup("foo");
Example e(freeableFoo); // e.string's lifetime is unknown
Example e1("literalFoo"); // e1.string is always valid
free(freeableFoo);
// e.string is now invalid
如示例所示,当freeableFoo
为free()
ed 时,e.string
成员变为无效。这是在Example
不知情的情况下发生的。
如果Example
在其构造函数中复制字符串,显然我们可以解决这个问题,但我不想为副本分配内存。
Example
的构造函数是否可以声明“你必须传递一个字符串文字”(在编译时强制执行)所以Example
知道它不必复制字符串并且它知道它的 @ 987654333@指针会在应用程序的生命周期内有效吗?
【问题讨论】:
我认为这是***.com/questions/57543521/… 的重复,但这个问题也没有任何答案 它的用途是什么? @CherryDT 我可以看到你所说的会发生什么,但这并没有真正改变我的问题......我想知道是否有办法在编译时强制指针的内容不能改变。 @par 你可以在 C++20 中完成。喜欢this 可以简化a bit 或者让眼睛更容易。 @par 如果没有consteval
(仅在 C++20 中存在),我看不出你怎么能做到。除非您找到另一种机制,如果表达式/参数在编译时不是“已知”,则强制编译器抱怨。
【参考方案1】:
只需让构造函数显式采用右值即可:
struct Example
Example(const char*&& s) : string(s)
const char* string;
;
【讨论】:
请注意:Examplestrdup("str")
有效,需要 free
。
@VainMan,说得好。唯一的一点,我想这是对原始问题的一个很好的评论,而不是对答案的评论,因为它与前者有关。以上是关于在 C++ 中是不是可以强制执行字符串文字函数参数?的主要内容,如果未能解决你的问题,请参考以下文章