在 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

如示例所示,当freeableFoofree()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++ 中是不是可以强制执行字符串文字函数参数?的主要内容,如果未能解决你的问题,请参考以下文章

C++ 字符串如何转数字

在 C++ 模板中发送字符串文字作为参数 - 参数包

python中字符类型是不是可以强制转化为bool类型

typescript:传递一个接受较少参数的函数 - 如何为传递的函数强制执行相同数量的参数

c++如何改变控制台文字颜色

我可以将 asm 函数与 c - 字符串变量而不是字符串文字作为参数一起使用吗? [复制]