问题标签 [most-vexing-parse]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
2 回答
325 浏览

c++ - 函数定义还是变量定义?

为什么编译器将此行解释为函数定义而不是变量定义:

在以下代码中:

VS2010 在“yf();”行给出以下错误

标准的哪一部分描述了这种行为?以下问题的答案没有提供有关它的详细信息: Most vexing parse

0 投票
2 回答
91 浏览

c++ - 构造函数不运行

我不明白,因为当您创建“用户”类的对象时,不会打印包含构造函数的消息。

0 投票
1 回答
586 浏览

c++ - 将匿名函数对象传递给 std::function?

这是我的问题:我定义了一个仿函数:

然后我使用匿名函子创建一个 std::function 对象,我发现了一些奇怪的东西。这是我的代码:

不幸的是,这是错误的。错误信息是:

但是,当我按如下方式更改代码时:

或者

结果是对的。那么,为什么会这样呢?请帮助我理解它。谢谢。

0 投票
2 回答
632 浏览

c++ - 函数调用中的临时构造被解释为声明

最近我遇到了一个问题,它以某种方式(但仅以某种方式)对我有意义。它基于将临时构造解释为单个 (!) 构造函数参数的声明。请看下面的最小示例。

我已经读过这样的表达:

被解释为(如果有标准构造函数)作为 a 的声明。这是有道理的,而且完全没问题,因为您可以使用 {} 括号来明确构造。但我不明白的是:

  1. 为什么bar0的构造会出现问题?所有Foos 都没有标准构造函数。因此,将诸如Foo0(x)声明之类的内容解释为x.

  2. 为什么建设bar1bar2工作?对我来说,作品的构造是显而易见的bar4,因为我对所有临时 s 使用 {}-括号Foo,因此我明确说明了我想要什么。

  3. 如果只需要使用只有一个Foos 的 {} 括号来解决问题......为什么构造bar3失败?

  4. 此外,在构造任何 Bar 之前声明 x。为什么编译器不抱怨呢?

最后一个问题与我的最后一行示例代码有关。长话短说:编译器认为我想让他做什么,我在哪里错过了阴影的出现?

PS:如果有兴趣——我使用 gcc-4.9.2。
PPS:我尝试了相同bar的构造函数,将三个Foo0s 作为参数。同样的故事在这里。但是该错误没有说明冲突的声明,而是重新定义x.

0 投票
2 回答
554 浏览

c++ - g++ 拒绝,clang++ 接受: foo(x)("bar")("baz");

前几天有人为什么有些东西可以用clang编译,但不能用gcc编译。我直观地理解正在发生的事情并能够帮助这个人,但这让我想知道——根据标准,哪个编译器是正确的?这是代码的简化版本:

这与 clang++ 编译得很好,但 g++ 给出了以下错误:

如果我在第 21 行添加一对括号,g++ 很高兴:

换句话说,g++ 将此行解释为:

我认为它是 g++ 中的错误,但我又想问标准专家,哪个编译器出错了?

PS:gcc-4.8.3、clang-3.5.1

0 投票
1 回答
647 浏览

c++ - 设置打包任务的正确方法

编译下面的程序时,我收到错误消息:

错误 1 ​​错误 C2228: '.get_future' 左侧必须有类/结构/联合 c:\users\haliaga\documents\visual studio 2010\projects\test\test\accumulateexceptionsafe.cpp 62 1 测试

这实际上不是真正的问题。

如果您评论这些行:

你会得到下面的警告,说“task”没有被调用:

*警告 C4930: 'std::packaged_task<> task(accumulate_block (__cdecl )(void))': 未调用原型函数(是否打算定义变量?) 1> with 1> [ 1> =int (std::_List_iterator >>,std::_List_iterator>>), 1> 迭代器=std::_List_iterator>>, 1> T=int 1> ]

什么是指定的正确方法:

?

谢谢

PS:找到下面的代码:

0 投票
1 回答
127 浏览

c++ - 强制消除最棘手的解析的歧义为函数声明

我在“最令人烦恼的解析”中看到的所有讨论都在讨论如何强制编译器将 case 视为带有初始化程序的变量声明(而不是实际解释为函数声明)。例如,请参阅这个 stackoverflow 线程来自 Ask-Coder 的这篇文章

我的团队有一个规则:强制尽可能多的警告成为错误。目标是防止杂乱无章地进入代码;成功的编译应该是静默的,禁用警告是灾难的根源。这一切都非常好,除了我被最令人烦恼的解析所咬伤,声明实际上解析了我希望它解析的方式。

具体来说:

如 Ask-Coder 文章所示,这个代码片段确实触发了 clang 中的 Most Vexing Parse 警告,然后我们将其转换为错误,这让我大吃一惊。

我可以在此处的语法中做些什么来使(a)合法的 C 声明(不仅仅是 C++)和(b)不触发 Most Vexing Parse 警告吗?还是我必须跳#pragma dance 并在这行代码周围使警告静音?

0 投票
1 回答
240 浏览

c++ - 从 'Type (__cdecl *)(std::istream)' 到 'Type &' 的转换

在 C++ 中调用模板函数时,我无法理解错误的原因。有问题的函数是 rapidjson 的一部分,定义如下:

我的调用代码是:

但是 MS Visual Studio 2013 向我显示了错误:

据我了解,用于实例化的类型与传递给模板函数的类型完全相同。这段代码只是为了演示这个问题——在我的原始代码中,istream 不是来自文件——所以为来自 rapidjson 的文件建议一个不同的读取类并不能解决我的问题。我也想了解,为什么这里会发生这个错误。

有任何想法吗?

0 投票
1 回答
191 浏览

c++ - 最令人烦恼的解析是否带有限定ID?

考虑:

第 1 行是否是最令人头疼的解析,即使它Foo::bar是一个限定 ID并且不可能是一个有效的参数名称?Clang 和 GCC 不同意;哪个编译器是正确的?

0 投票
1 回答
318 浏览

c++ - 通过编译错误 C++ 在 RAII 中强制执行非临时性

当有人像这样在 C++ 中使用 lock_guard 时:

编译器抱怨:

因为正确的用法是:

我想编写一个自定义的 RAII 分配器,当这种情况发生时它也会发生故障 - 我尝试禁用复制构造函数和分配运算符,但到目前为止没有任何效果。