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

Function with pointer to a function and vector with default value as arguments results in compilation error

本文关键字:函数 错误 向量 参数 编译 指针 默认值      更新时间:2023-10-16

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

#include <vector>
void func(double (* fptr)(double), const std::vector<double> & 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(const std::vector<double> & v = {})

错误消失。是MSVC的漏洞还是我遗漏了什么?

Clang和G++的代码没有问题。

您可以使用签出代码https://rextester.com/l/cpp_online_compiler_visual

是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, {})
}

尽管值得注意的是,取func的地址现在是模糊的,这与您最初的完全符合标准的代码不同。