Переопределение встроенной статической переменной-члена msvc - PullRequest
0 голосов
/ 19 января 2019

Я новичок в C ++ 17. Учитывая следующий код:

// ---------------
// in MyClass.hpp
// ---------------
#pragma once

class MyClass {
public:
    static const int A;
};

inline const int MyClass::A = 100;

// ---------------
// in test.cpp
// ---------------
#include <stdio.h>
#include "MyClass.hpp"

void test() {
    printf("test: %p\n", &MyClass::A);
}

// ---------------
// in main.cpp
// ---------------
#include <stdio.h>
#include "MyClass.hpp"

extern void test();

int main() {
    printf("main: %p\n", &MyClass::A);
    test();
}

При компиляции с MinGW-W64 g ++ 8.1.0

g++ -std=c++17 main.cpp test.cpp -o test.exe

Выход

main: 00000000004044B0
test: 00000000004044B0

, который работает как положено.

Однако в MSVC 2017

cl /std:c++17 main.cpp test.cpp

Я получил ошибку компилятора, сказав переопределение «public: static int const MyClass :: A». (Извините, вывод компилятора содержит китайские иероглифы. Не следует публиковать здесь напрямую.)

Почему код работает под g ++, но не работает в MSVC? Я сделал что-то не так?

1 Ответ

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

Я могу подтвердить, что Clang принимает ваш код без предупреждения.

Меня беспокоит то, что cppreference показывает следующее примечание:

Встроенный спецификатор не может повторно объявить функциюили переменная (начиная с C ++ 17), которая уже была определена в модуле перевода как не встроенная.

Я не смог определить истинную причину для этой заметки в стандарте C ++.Но поскольку cppreference в своих предупреждениях, как правило, верен, я предполагаю, что именно поэтому MSVC захлебывается вашим кодом.Вероятно, он ожидает:

// ---------------
// in MyClass.hpp
// ---------------
#pragma once

class MyClass {
public:
    static const int A = 100;
};

, чтобы избежать предыдущего не встроенного объявления с последующим встроенным определением.

...