VSCode говорит, что std :: chrono является неоднозначным, если оператор << перегружен - PullRequest
1 голос
/ 22 января 2020

У меня перегружено operator<< для std::chrono::duration. Насколько я понимаю, я должен поместить это в пространство имен std::chrono, чтобы ADL работал. Однако, по какой-то причине, когда я делаю это, все другие ссылки на std::chrono::duration помечаются VSCode как ambiguous. Это может быть просто ошибка VSCode, но она использует clangd для проверки правильности, поэтому мне интересно, действительно ли что-то не так с моим кодом. Он компилируется , но VSCode не использует точно то же самое clang, с которым я компилирую, так что, возможно, мой просто более разрешительный?

Самый маленький пример, который я мог бы придумать, :

#include <chrono>
#include <iostream>

// marks chrono as ambiguous
using std::chrono::milliseconds;

namespace std {
namespace chrono {

// again marks chrono as ambiguous
template <class U, class T>
std::ostream& operator<<(std::ostream& os, const typename ::std::chrono::duration<U, T>& dur) {
  os << "foo";
  return os;
}

}  // namespace chrono
}  // namespace std

namespace example {

void DoThing() {
  // NOT marked as ambiguous
  milliseconds x(10);
  // Says no match for operator<< and milliseconds
  std::cout << x;
}

}  // namespace example

Похоже ли это кому-то, что это недопустимо в C ++ или это более вероятно ошибка clangd или VSCode?

1 Ответ

4 голосов
/ 22 января 2020

Ваш код недопустим и имеет неопределенное поведение. Вы не можете добавлять свои собственные функции в пространство имен std. Единственное, что вам разрешено добавлять в него, это специализации шаблонов функций (до C ++ 20) и специализации шаблонов классов ваших собственных типов.

Несколько дополнительных советов: вы не должны перегружать операторы для типов, которые вы не делаете. своя. Если владелец этого типа решит добавить его самостоятельно, то вы можете / будете иметь нарушение ODR (One Definition Rule), и для него не требуется диагностика c от компилятора, что может привести к очень трудным поискам ошибок. Если вы хотите расширить функциональность, создайте собственную именованную функцию в собственном пространстве имен.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...