Функция с указателем на функцию и вектор со значением по умолчанию в качестве аргументов приводит к ошибке компиляции - PullRequest
0 голосов
/ 22 января 2019

Почему следующий код не компилируется в 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: '{': отсутствует заголовок функции (формальный список старого стиля?)

Microsoft (R) C / C ++ Оптимизирующая версия компилятора 19.00.23506 для 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

1 Ответ

0 голосов
/ 22 января 2019

Это какая-то ошибка 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 теперь неоднозначно, в отличие от вашего исходного, совершенно стандартного соответствующего кода.

...