问题标签 [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.
c++ - 函数定义还是变量定义?
为什么编译器将此行解释为函数定义而不是变量定义:
在以下代码中:
VS2010 在“yf();”行给出以下错误
标准的哪一部分描述了这种行为?以下问题的答案没有提供有关它的详细信息: Most vexing parse
c++ - 构造函数不运行
我不明白,因为当您创建“用户”类的对象时,不会打印包含构造函数的消息。
c++ - 将匿名函数对象传递给 std::function?
这是我的问题:我定义了一个仿函数:
然后我使用匿名函子创建一个 std::function 对象,我发现了一些奇怪的东西。这是我的代码:
不幸的是,这是错误的。错误信息是:
但是,当我按如下方式更改代码时:
或者
结果是对的。那么,为什么会这样呢?请帮助我理解它。谢谢。
c++ - 函数调用中的临时构造被解释为声明
最近我遇到了一个问题,它以某种方式(但仅以某种方式)对我有意义。它基于将临时构造解释为单个 (!) 构造函数参数的声明。请看下面的最小示例。
我已经读过这样的表达:
被解释为(如果有标准构造函数)作为 a 的声明。这是有道理的,而且完全没问题,因为您可以使用 {} 括号来明确构造。但我不明白的是:
为什么bar0的构造会出现问题?所有
Foo
s 都没有标准构造函数。因此,将诸如Foo0(x)
声明之类的内容解释为x
.为什么建设
bar1
和bar2
工作?对我来说,作品的构造是显而易见的bar4
,因为我对所有临时 s 使用 {}-括号Foo
,因此我明确说明了我想要什么。如果只需要使用只有一个
Foo
s 的 {} 括号来解决问题......为什么构造bar3
失败?此外,在构造任何 Bar 之前声明 x。为什么编译器不抱怨呢?
最后一个问题与我的最后一行示例代码有关。长话短说:编译器认为我想让他做什么,我在哪里错过了阴影的出现?
PS:如果有兴趣——我使用 gcc-4.9.2。
PPS:我尝试了相同bar
的构造函数,将三个Foo0
s 作为参数。同样的故事在这里。但是该错误没有说明冲突的声明,而是重新定义x
.
c++ - g++ 拒绝,clang++ 接受: foo(x)("bar")("baz");
前几天有人问为什么有些东西可以用clang编译,但不能用gcc编译。我直观地理解正在发生的事情并能够帮助这个人,但这让我想知道——根据标准,哪个编译器是正确的?这是代码的简化版本:
这与 clang++ 编译得很好,但 g++ 给出了以下错误:
如果我在第 21 行添加一对括号,g++ 很高兴:
换句话说,g++ 将此行解释为:
我认为它是 g++ 中的错误,但我又想问标准专家,哪个编译器出错了?
PS:gcc-4.8.3、clang-3.5.1
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:找到下面的代码:
c++ - 强制消除最棘手的解析的歧义为函数声明
我在“最令人烦恼的解析”中看到的所有讨论都在讨论如何强制编译器将 case 视为带有初始化程序的变量声明(而不是实际解释为函数声明)。例如,请参阅这个 stackoverflow 线程和来自 Ask-Coder 的这篇文章。
我的团队有一个规则:强制尽可能多的警告成为错误。目标是防止杂乱无章地进入代码;成功的编译应该是静默的,禁用警告是灾难的根源。这一切都非常好,除了我被最令人烦恼的解析所咬伤,声明实际上解析了我希望它解析的方式。
具体来说:
如 Ask-Coder 文章所示,这个代码片段确实触发了 clang 中的 Most Vexing Parse 警告,然后我们将其转换为错误,这让我大吃一惊。
我可以在此处的语法中做些什么来使(a)合法的 C 声明(不仅仅是 C++)和(b)不触发 Most Vexing Parse 警告吗?还是我必须跳#pragma dance 并在这行代码周围使警告静音?
c++ - 从 'Type (__cdecl *)(std::istream)' 到 'Type &' 的转换
在 C++ 中调用模板函数时,我无法理解错误的原因。有问题的函数是 rapidjson 的一部分,定义如下:
我的调用代码是:
但是 MS Visual Studio 2013 向我显示了错误:
据我了解,用于实例化的类型与传递给模板函数的类型完全相同。这段代码只是为了演示这个问题——在我的原始代码中,istream 不是来自文件——所以为来自 rapidjson 的文件建议一个不同的读取类并不能解决我的问题。我也想了解,为什么这里会发生这个错误。
有任何想法吗?
c++ - 最令人烦恼的解析是否带有限定ID?
考虑:
第 1 行是否是最令人头疼的解析,即使它Foo::bar
是一个限定 ID并且不可能是一个有效的参数名称?Clang 和 GCC 不同意;哪个编译器是正确的?
c++ - 通过编译错误 C++ 在 RAII 中强制执行非临时性
当有人像这样在 C++ 中使用 lock_guard 时:
编译器抱怨:
因为正确的用法是:
我想编写一个自定义的 RAII 分配器,当这种情况发生时它也会发生故障 - 我尝试禁用复制构造函数和分配运算符,但到目前为止没有任何效果。