пространство имен в флагах отладки определенных в классе функций-друзей - PullRequest
0 голосов
/ 07 февраля 2019

Я имею дело с классом, который определяет функцию друга в классе без внешнего объявления

namespace our_namespace {
template <typename T>
struct our_container {

  friend our_container set_union(our_container const &, our_container const &) {
    // meaningless for the example here, just a valid definition
    // no valid semantics
    return our_container{};
  }
};
}  // namespace our_namespace

Как обсуждалось (например, здесь или здесь )функция set_union не находится в пространстве имен our_namespace, но будет найдена в зависимости от аргументов:

auto foo(std::vector<our_namespace::our_container<float>> in) {
  // works:
  return set_union(in[0], in[1]);
}

Однако я заметил, что в флагах отладки set_union выглядит какнаходиться в our_namespace пространстве имен

        mov     rdi, qword ptr [rbp - 40] # 8-byte Reload
        mov     rsi, rax
        call    our_namespace::set_union(our_namespace::our_container<float> const&, our_namespace::our_container<float> const&)
        add     rsp, 48
        pop     rbp
        ret
our_namespace::set_union(our_namespace::our_container<float> const&, our_namespace::our_container<float> const&): # @our_namespace::set_union(our_namespace::our_container<float> const&, our_namespace::our_container<float> const&)
        push    rbp
        mov     rbp, rsp
        mov     qword ptr [rbp - 16], rdi
        mov     qword ptr [rbp - 24], rsi
        pop     rbp
        ret

, хотя я не могу назвать его как our_namespace::set_union

auto foo(std::vector<our_namespace::our_container<float>> in) {
  // fails:
  return our_namespace::set_union(in[0], in[1]);
}

Любые подсказки о том, как понимать информацию отладки?

РЕДАКТИРОВАТЬ: тело функции set_union является только примером, чтобы иметь правильное определение.

1 Ответ

0 голосов
/ 07 февраля 2019

Стандарт C ++ определяет поведение компилятора только в отношении компиляции кода и поведения результирующей программы.Он не определяет все аспекты генерации кода и, в частности, не определяет символы отладки.

Таким образом, ваш компилятор правильно (в соответствии со стандартом) запрещает вызывать функцию через пространство имен, в котором он не находится.Но так как функция существует, и вы должны быть в состоянии отладить ее, она должна где-то поместить символ отладки.Кажется, разумным выбором является вложение пространства имен.

...