gpt4 book ai didi

c++ - 从 std::istreambuf_iterator 创建 std::string,奇怪的语法怪癖

转载 作者:可可西里 更新时间:2023-11-01 15:48:38 24 4
gpt4 key购买 nike

我在某处发现了以下用于将文件读入字符串的习语:

std::ifstream file("path/to/some/file.ext");
std::string contents(
std::istreambuf_iterator<char>(file),
(std::istreambuf_iterator<char>())
);

它现在工作得很好。但是,如果我删除第二个迭代器参数周围的括号,即:

std::string contents(
std::istreambuf_iterator<char>(file),
std::istreambuf_iterator<char>()
);

一旦我尝试在字符串对象上调用任何方法,例如:

const char *buffer = contents.c_str();

我收到以下形式的编译错误:

error: request for member 'c_str' in 'contents', which is of non-class type 'std::string(std::istreambuf_iterator<char, std::char_traits<char> >, std::istreambuf_iterator<char, std::char_traits<char> > (*)()) {aka std::basic_string<char>(std::istreambuf_iterator<char, std::char_traits<char> >, std::istreambuf_iterator<char, std::char_traits<char> > (*)())}'

此外,如果我尝试将该字符串分配给另一个字符串:

std::string contents2 = contents;

我收到以下形式的错误:

error: conversion from 'std::string(std::istreambuf_iterator<char, std::char_traits<char> >, std::istreambuf_iterator<char, std::char_traits<char> > (*)()) {aka std::basic_string<char>(std::istreambuf_iterator<char, std::char_traits<char> >, std::istreambuf_iterator<char, std::char_traits<char> > (*)())}' to non-scalar type 'std::string {aka std::basic_string<char>}' requested

这是为什么?我看不出需要这些括号的原因,更不用说影响 contents 的类型定义了。多变的。我正在使用 g++ 4.8.2。

最佳答案

这是 Most Vexing Parse 的一个例子:

std::string contents(
std::istreambuf_iterator<char>(file),
std::istreambuf_iterator<char>()
);

该语句被解析为名为 contents 的函数的声明,该函数采用两个参数。第一个参数是 std::istreambuf_iterator 类型的名为 file 的变量,第二个参数是不带参数并返回 std::istreambuf_iterator。函数参数名称的规范是可选的。

将至少一个表达式括在括号中会使它被解析为变量定义。

C++11 通过提供统一初始化解决了这个问题:

std::string contents{std::istreambuf_iterator<char>{file}, {}};

关于c++ - 从 std::istreambuf_iterator 创建 std::string,奇怪的语法怪癖,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25517397/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com