Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/156.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 指针指向函数的函数和参数为默认值的向量会导致编译错误_C++_Visual C++_Function Pointers_Initializer List_Default Arguments - Fatal编程技术网

C++ 指针指向函数的函数和参数为默认值的向量会导致编译错误

C++ 指针指向函数的函数和参数为默认值的向量会导致编译错误,c++,visual-c++,function-pointers,initializer-list,default-arguments,C++,Visual C++,Function Pointers,Initializer List,Default Arguments,为什么下面的代码不能在MSVC上编译 #include <vector> void func(double (* fptr)(double), const std::vector<double> & v = {}) { } #包括 void func(double(*fptr)(double),const std::vector&v={}) { } 我有以下错误 source_file.cpp(6):错误C2065:“fptr”:未声明的标识符 source

为什么下面的代码不能在MSVC上编译

#include <vector>

void func(double (* fptr)(double), const std::vector<double> & v = {})
{
}
#包括
void func(double(*fptr)(double),const std::vector&v={})
{
}
我有以下错误

source_file.cpp(6):错误C2065:“fptr”:未声明的标识符

source_file.cpp(6):错误C2062:意外键入“double”

source_file.cpp(6):错误C2143:语法错误:缺少“;”在“{”之前

source_file.cpp(6):错误C2143:语法错误:在“;”之前缺少“)”

source_file.cpp(6):错误C2447:“{”:缺少函数头(旧式正式列表?)

source_file.cpp(6):错误C2059:语法错误:')'

source_file.cpp(7):错误C2447:“{”:缺少函数头(旧式正式列表?)

针对x64的Microsoft(R)C/C++优化编译器版本19.00.23506

当我删除其中一个-向量默认值时:

void func(double (* fptr)(double), const std::vector<double> & v)
void func(双精度(*fptr)(双精度),常数std::vector&v)
或函数指针:

void func(const std::vector<double> & v = {})
void func(const std::vector&v={})
错误消失了。是MSVC的错误还是我遗漏了什么

Clang和G++对代码没有问题

您可以使用

是MSVC的漏洞还是我遗漏了什么

你什么都没有错过。这是一个MSVC错误。你可以通过重载来解决它:

void func(double (* fptr)(double), const std::vector<double> & v)
{
}

void func(double (* fptr)(double)) {
    std::vector<double> v;
    func(fptr, v); // or just func(fptr, {})
}
void func(双精度(*fptr)(双精度),常数std::vector&v)
{
}
无效函数(双(*fptr)(双)){
std::向量v;
func(fptr,v);//或者只是func(fptr,{})
}

尽管值得注意的是,与原始的完全符合标准的代码不同,使用
func
的地址现在变得模棱两可。

您使用的是什么版本的MSVC?对我来说,这看起来像个bug。@NathanOliver,在我自己的机器MSVC2015上,rexester报告了
Microsoft(R)C/C++优化编译器版本19.00.23506
。好的。我现在正在更新到2017年的最新版本以进行测试。15.8.7失败。好的,15.9.5版本在编译器19.16.27026.1中也失败。看起来问题已经报告给开发人员社区(无法找到链接)但是它没有状态或确认。在第二个函数中使用
func(fptr,{})
?@NathanOliver-也一样。我的意思是,我通常只在需要可选的非常量左值时才这样做,所以这是一种习惯。