【问题标题】:Function with pointer to a function and vector with default value as arguments results in compilation error带有指向函数的指针和带有默认值作为参数的向量的函数会导致编译错误
【发布时间】:2019-06-16 01:23:43
【问题描述】:

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

#include <vector>

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

我收到以下错误。

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

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

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

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

source_file.cpp(6): error C2447: '{': 缺少函数头(旧式正式列表?)

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

source_file.cpp(7): error C2447: '{': 缺少函数头(旧式正式列表?)

Microsoft (R) C/C++ 优化编译器版本 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

【问题讨论】:

  • 您使用的是什么版本的 MSVC?这对我来说像是一个错误。
  • @NathanOliver,在我自己的机器 MSVC2015 上,rexester 报告 Microsoft (R) C/C++ Optimizing Compiler Version 19.00.23506
  • 好的。我现在正在更新到 2017 的最新版本进行测试。 15.8.7 失败。
  • 好吧,版本 15.9.5 也因编译器 19.16.27026.1 而失败。看起来该问题已报告给开发者社区(无法弄清楚如何获取链接),但它没有状态或确认。

标签: c++ visual-c++ function-pointers initializer-list default-arguments


【解决方案1】:

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

虽然值得注意的是,现在获取func 的地址是模棱两可的,这与您原来的、完全符合标准的代码不同。

【讨论】:

  • 在第二个函数中改用func(fptr, {})
  • @NathanOliver - 那也是。我的意思是,我通常只在需要可选的非常量左值时才这样做,所以这是一种习惯。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-04-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多