为什么在此代码中,std::string 的第一个参数需要 parens?[复制]

Why are parens needed for the first argument to std::string in this code? [duplicate]

提问人:flakes 提问时间:4/3/2023 更新时间:4/3/2023 访问量:58

问:

我正在尝试将文本从文件加载到实例中。我遇到了这个答案,并将其改编为:const char*

std::ifstream vertex_shader_stream("shaders/demo1_vert.glsl");
std::string vertex_shader_string(
  (std::istreambuf_iterator<char>(vertex_shader_stream)),
  std::istreambuf_iterator<char>());
const char *vertex_shader_bytes = vertex_shader_string.c_str();

我难以理解的是,为什么第一个参数被包装在 parens 中。我以为这可能是一些多余的打字,但在调用时没有它们似乎会失败std::string()(std::istreambuf_iterator<char>(vertex_shader_stream))c_str

error: request for member ‘c_str’ in ‘vertex_shader_string’, 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::__cxx11::basic_string<char>(std::istreambuf_iterator<char, std::char_traits<char> >, std::istreambuf_iterator<char, std::char_traits<char> > (*)())’}
[build]    61 |   const char *vertex_shader_text = vertex_shader_string.c_str();
[build]       |                                                         ^~~~~

我不是在这里摸索错误,有人可以向我详细解释这是怎么回事吗?我敢肯定这可能是重复的,所以如果是这种情况,请随时关闭投票,我只是不知道要搜索的正确术语!

谢谢!

C++ 字符串 std

评论

3赞 user12002570 4/3/2023
最令人烦恼的解析
2赞 user12002570 4/3/2023
请参阅 dupe 如何通过直接值初始化来避免最令人烦恼的解析?
0赞 flakes 4/3/2023
@Jason 非常感谢。我不认为我自己会很快找到它。这些 cpp 概念有时会在午餐中起到这样的名称。
1赞 user12002570 4/3/2023
是的,没错。请参阅此处的警告。这就是为什么建议始终启用所有警告的原因。
1赞 flakes 4/3/2023
@Jason 是的,会认为警告是默认的。让我所有的鸭子都排成一排开始 cpp dev 将是一次有趣的旅程。再次感谢!

答: 暂无答案