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

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

为什么以下代码无法在 MSVC 上编译

#include <vector>

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

我遇到以下错误。

source_file.cpp(6): error C2065: 'fptr': undeclared identifier

source_file.cpp(6): error C2062: type 'double' unexpected

source_file.cpp(6): error C2143: syntax error: missing ';' before '{'

source_file.cpp(6): error C2143: syntax error: missing ')' before ';'

source_file.cpp(6): error C2447: '{': missing function header (old-style formal list?)

source_file.cpp(6): error C2059: syntax error: ')'

source_file.cpp(7): error C2447: '{': missing function header (old-style formal list?)

Microsoft (R) C/C++ Optimizing Compiler Version 19.00.23506 for x64

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

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

Is it some MSVC bug or am I missing something?

你什么也没错过。这是一个 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 的地址现在是模棱两可的,这与原始的、完全符合标准的代码不同。