gpt4 book ai didi

c++ - (已知)VC12 中的编译器错误?

转载 作者:IT老高 更新时间:2023-10-28 12:54:29 26 4
gpt4 key购买 nike

使用 VC12(在 Visual Studio 2013 RTM 中)[1] 编译此程序会导致崩溃(在所有构建配置中),而实际上它不应该:

#include <string>

void foo(std::string const& oops = {})
{
}

int main()
{
foo();
}

我知道两个可能相关的无声的错误代码生成错误:

老实说,我认为这些是不同的。有谁知道

  1. 在连接上是否存在主动跟踪的错误
  2. 是否有解决方法(或明确描述导致此错误的情况,以便我们可以在代码库中查找/避免它)?

[1] 只需使用 C++ 控制台应用程序“向导”创建一个空项目。为简单起见,禁用预编译头文件并保留所有默认值:http://i.stack.imgur.com/rrrnV.png

最佳答案

看起来 Visual Studio 在默认参数是 initializer list 时调用的构造函数只是被破坏了。这段代码:

#include <iostream>

struct test {
test () { std::cout << "test ()" << std::endl ; }
test (int) { std::cout << "test (int)" << std::endl ; }
};

void func( test const &s = {} )
{
}

int main()
{
test s = {} ;
func() ;
}

gccclang 中产生这个结果,见 live here :

test ()
test ()

Visual Studio 产生这个结果:

test ()
test (int)

对于这段代码:

#include <iostream>
#include <initializer_list>

struct test {
test () { std::cout << "test ()" << std::endl ; };

test (int) { std::cout << "test (int)" << std::endl ; };
test ( std::initializer_list<int>) { std::cout << "test (initializer_list<int>)" << std::endl ; } ;
};

void func( test const &s = {0} )
{
}

int main()
{
test s = {0} ;
func() ;
}

gccclang 产生这个结果看看 live here :

 test (initializer_list<int>)
test (initializer_list<int>)

Visual Studio 产生此错误:

 error C2440: 'default argument' : cannot convert from 'initializer-list' to 'const test &'
Reason: cannot convert from 'initializer-list' to 'const test'
No constructor could take the source type, or constructor overload resolution was ambiguous

更新

为了进行健全性检查,我回到了标准,以确保在这种差异的根源上没有一些奇怪的规则,或者可能是某些限制导致此代码格式错误。据我所知,这段代码不是格式错误的8.3.5 节语法特别允许这样做:

parameter-declaration:
attribute-specifier-seqopt decl-specifier-seq declarator
attribute-specifier-seqopt decl-specifier-seq declarator = initializer-clause
[...]

8.5 Initializers8.3.6 默认参数 部分似乎没有添加任何限制,但这个缺陷报告994. braced-init-list as a default argument 和工作文件Wording for brace-initializers as default arguments明确它的意图并概述对标准所做的更改以允许它并查看增量没有明显的限制。

关于c++ - (已知)VC12 中的编译器错误?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21044488/

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