标签: string-literals

将传递的参数限制为字符串文字

我有一个类来包装字符串文字并在编译时计算大小.

构造函数如下所示:

template< std::size_t N >
Literal( const char (&literal)[N] );

// used like this
Literal greet( "Hello World!" );
printf( "%s, length: %d", greet.c_str(), greet.size() );
Run Code Online (Sandbox Code Playgroud)

但是代码有问题.下面的代码编译,我想使它成为一个错误.

char broke[] = { 'a', 'b', 'c' };
Literal l( broke );
Run Code Online (Sandbox Code Playgroud)

有没有办法限制构造函数,使它只接受c字符串文字?编译时间检测是首选,但如果没有更好的方法,则可以接受运行时.

c++ string-literals c++11

5
推荐指数
2
解决办法
2342
查看次数

sizeof()显示不同的输出

这是一段C99代码:

int main(void)
{
    char c[] = "\0";
    printf("%d %d\n", sizeof(c), strlen(c));

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

该程序正在输出2 0.我不明白为什么sizeof(c)暗示2看到我定义c为立即NULL终止的字符串文字.有人可以解释为什么会这样吗?你能否提供(某些)资源,我可以在我自己的时间进一步研究这种现象.

c sizeof string-literals

5
推荐指数
1
解决办法
421
查看次数

是否有理由在此代码中对字符串文字使用const_cast?

我正在寻找一些我即将开始使用的API的示例代码.以下模式让我有点困惑:

char* str;
str = const_cast<char*>("Hello World");

printf("%s ", str);
Run Code Online (Sandbox Code Playgroud)

(实际上,str在每种情况下都有一个巨大的案例陈述.)

需要注意的是printf需要const char*.这种错综复杂的转换有任何合理的目的吗?这段代码的作者在其他地方应用了许多以性能为导向的技巧,但没有解释这里发生了什么.

我的直觉是将此代码更改为:

const char* str;
str = "Hello World";

printf("%s ", str);
Run Code Online (Sandbox Code Playgroud)

我错过了什么吗?

c++ const-cast string-literals c++11

5
推荐指数
1
解决办法
414
查看次数

是否有理由将运算符“”放入std :: literals :: string_literals?

我很惊讶地发现该代码未编译(假设我们使用的是C ++ 14编译器):

std::cout << "hello world!\n"s;
Run Code Online (Sandbox Code Playgroud)

ideone显示的错误如下

找不到字符串文字运算符“ operator””

幸运的是,使用以下using语句修复起来非常简单:

using namespace std::literals::string_literals;
std::cout << "hello world!\n"s; // Compiles!
Run Code Online (Sandbox Code Playgroud)

我想知道是否将标准字符串用户定义的文字放在不同于其std::string本身的名称空间中的原因是什么?我一直在思考,但我不知道原因。

无法与operator""sfrom 冲突,std::chrono因为它们使用不同的类型:

auto ten_seconds = 10s; // ten seconds
auto some_string = "some string"s; // some string
Run Code Online (Sandbox Code Playgroud)

我在想,在resason可能是不会发生冲突与我的用户定义的文字,但该标准说的是我必须用preceed他们'_'下划线

警告:保留不带'_'的文字运算符后缀以供将来标准化

因此,我很惊讶,没有人知道将字符串文字运算符放入std::literals::string_literals?中的原因。

谢谢。

c++ string-literals user-defined-literals c++14

5
推荐指数
0
解决办法
80
查看次数

原始字符文字

我不知道我是否遗漏了某些内容,或者它确实不存在.在C++ 11标准中,添加了原始字符串文字:

string s = "\\w\\\\\\w"; // I hope I got that right
string s = R"(\w\\\w)";  // I'm pretty sure I got that right
Run Code Online (Sandbox Code Playgroud)

但我尝试使用原始字符文字的所有尝试都失败了:

constexpr char bslash = R('\'); // error: missing terminating ' character
constexpr char bslash = R'(\)'; // error: 'R' was not declared in this scope
Run Code Online (Sandbox Code Playgroud)

第二次尝试被认为是一个多字符常量!我发现使用类似于Raw字符文字的唯一方法是:

constexpr char slash = *R"(\)"; // All Ok.
Run Code Online (Sandbox Code Playgroud)

但我不喜欢这种表示法(取消引用字符串文字以存储第一个元素的副本),因为它有点令人困惑.

嗯,问题是什么?

  • Raw字符文字是否存在?(我没有发现任何关于他们的信息所以我几乎不确定他们没有
    • 如果它们存在:我应该如何编写Raw字符文字?
    • 如果它们不存在:为什么?是否有理由添加原始字符串文字但AVOID添加原始字符文字?

c++ character string-literals c++11

5
推荐指数
1
解决办法
880
查看次数

为什么可以将数组赋给char指针?

通常,当您声明指针(例如int)时,您必须为其分配一个内存地址:

int value = 123;
int* p = &value;
Run Code Online (Sandbox Code Playgroud)

创建char指针时,可以为其指定char数组,而无需包含地址:

char* c = "Char Array";
Run Code Online (Sandbox Code Playgroud)

这是如何运作的?它是否分配内存并指向它?为什么其他类型的指针不能做同样的事情?

c++ arrays pointers string-literals

5
推荐指数
1
解决办法
797
查看次数

如何在 C++17 中定义用户定义的字符串文字运算符模板?

根据我的C++17(草案)版本(16.5.8 [over.literal]) 以及cppreference.com,C++17应该支持用户定义的字符串文字的模板化运算符。

具体来说:

template <char...>
double operator "" _pi() {
    return 0.;
}

int main() {
  "test"_pi;
}
Run Code Online (Sandbox Code Playgroud)

然而,gcc 和 clang 都对我大喊大叫:

// gcc -Wall -Wextra -pedantic -std=c++17
error: no matching function for call to 'operator""_pi<char, 't', 'e', 's', 't'>()'
    7 |   "test"_pi;
      |   ^~~~~~~~~
note: candidate: 'template<char ...<anonymous> > double operator""_pi()'
    2 | double operator "" _pi() {

// clang -Wall -Wextra -pedantic -std=c++17
error: no matching literal operator for call to …
Run Code Online (Sandbox Code Playgroud)

c++ g++ string-literals clang++ c++17

5
推荐指数
1
解决办法
1099
查看次数

包含 Windows 路径的原始字符串会产生“SyntaxError:未终止的字符串文字”

我正在尝试使用我找到的 Shutil 脚本,但它收到了SyntaxError: unterminated string literal (detected at line 4). 任何有关修复此脚本或新脚本的帮助将不胜感激

import shutil
import os

source = r"C:\Users\[username]\Downloads\"
dest1 = r" C:\Users\[username]\Desktop\Reports\14"
dest2 = r" C:\Users\[username]\Desktop\Reports\52"
dest3 = r" C:\Users\[username]\Desktop\Reports\59"

files = os.listdir(source)

for f in files:
   
 if (f.startswith("Log 14")):
        shutil.move(f, dest1)
    elif (f.startswith("Log 54")):
        shutil.move(f, dest2)
Run Code Online (Sandbox Code Playgroud)

python syntax string-literals

5
推荐指数
1
解决办法
5万
查看次数

在 C++17 和 C++20 之间可移植地使用 UTF-8 字符串文字前缀

我有一个用 C++17 编写的代码库,它大量使用 UTF-8,以及u8c++11 中引入的字符串文字来指示 UTF 编码。然而,c++20 将C++ 中u8文字的含义从生成 a charor更改const char*为 a char8_tor const char8_t*;后者不能隐式指针转换const char*.

我希望这个项目能够支持在 C++17 和 C++20 模式下运行而不会出现中断;可以采取什么措施来支持这一点?


目前,该项目使用的char8别名使用文字的类型结果u8

// Produces 'char8_t' in C++20, 'char' in anything earlier
using char8 = decltype(u8' ');
Run Code Online (Sandbox Code Playgroud)

但这种方法存在一些问题:

  1. char不保证是无符号的,这使得从数值生成代码点不可移植(例如,char8{129}用 中断char,但不能用 中断char8_t)。

  2. char8char与C++17 中没有区别,后者可能会破坏现有代码,并可能导致错误。

  3. 从第 2 点继续,不可能在 C++17 中重载char …

c++ utf-8 string-literals c++17 c++20

5
推荐指数
1
解决办法
684
查看次数

C++ 中无前缀字符串的编码是什么?

C++ 中无前缀字符串的编码是什么?例如,所有字符串文字在 Java 中都被解析并存储为 UTF-16,在 Python3 中则被解析为 UTF-8。我猜想 C++ 文字就是这种情况u8""。但我不清楚像 之类的普通文字""

以下代码的输出应该是什么?

#include <iostream>
#include <iomanip>

int main() {
    auto c = "Hello, World!";
    while(*c) {
        std::cout << std::hex << (unsigned int){*c++} << " ";
    }
}
Run Code Online (Sandbox Code Playgroud)

当我在我的机器上运行它时,它会给出以下输出:

48 65 6c 6c 6f 2c 20 57 6f 72 6c 64 21 
Run Code Online (Sandbox Code Playgroud)

但这有保证吗?字符串文字的 Cppreference 页面表示普通字符串文字中的字符来自翻译字符集,翻译字符集指出:

翻译字符集由以下元素组成:

  • 由 ISO/IEC 10646 命名的每个字符,由其唯一的 UCS 标量值标识,以及
  • 每个 UCS 标量值的不同字符,其中未分配命名字符。

从这个定义来看,翻译字符集似乎是指 Unicode(或其超集)。那么除了显性之外,""和之间没有区别吗?u8""

假设如果我希望我的字符串采用 EBCDIC 编码(只是作为练习),那么在 …

c++ string character-encoding string-literals

5
推荐指数
1
解决办法
310
查看次数