std :: string можно передать как nlohmann :: json явному конструктору - PullRequest
0 голосов
/ 13 января 2020

Почему следующий код компилируется, даже если я передаю объект std::string в явный конструктор, который ожидает nlohmann::json (в библиотеку) объект? Насколько я понимаю, std::string не будет неявно преобразовано из-за ключевого слова explicit. Можно ли изменить мой код так, чтобы он успешно компилировался, только если передано nlohmann::json?

Я использую Visual Studio 2019 в режиме отладки с /Wall.

#include <nlohmann/json.hpp>

struct A {
    explicit A(nlohmann::json json) {

    }
};

int main() {
    std::string a = "hello";
    A b(a);
}

1 Ответ

1 голос
/ 13 января 2020

Почему следующий код компилируется, хотя я передаю объект std::string явному конструктору , который ожидает объект nlohmann::json (в библиотеку)? Насколько я понимаю, std::string не будет неявно преобразовано из-за ключевого слова * 1007.

explicit в конструкторе A просто означает, что конструктор A должен быть называется явно (что вы). Компилятору разрешено использовать неявные преобразования при передаче аргументов в конструктор A, если только они не используют типы, которые также являются explicit (что не является конструктором nlohmann::json).

Is Можно ли изменить мой код так, чтобы он успешно компилировался только при передаче nlohmann::json?

Вы можете передать аргумент по неконстантной ссылке, не позволяя компилятору передавать неявно созданный временный объект:

struct A {
    explicit A(nlohmann::json &json) {
    }
};
...