这些内联函数是否会导致未定义的行为

asi*_*mes -3 c++ undefined-behavior

Foo1.hpp

#pragma once

#include <string>

enum class Foo1 {
   A, B, C
};

// Commented out to avoid compiler error
//inline Foo1 fFromStr(const std::string& a) {
//    if (a == "A") return Foo1::A;
//    if (a == "B") return Foo1::B;
//    else          return Foo1::C;
//}

inline std::string fToStr(const Foo1 a) {
    switch (a) {
    case Foo1::A: return "A";
    case Foo1::B: return "B";
    default     : return "C";
    }
}
Run Code Online (Sandbox Code Playgroud)

Foo2.hpp

#pragma once

#include <string>

enum class Foo2 {
   A, B, C
};

// Commented out to avoid compiler error
//inline Foo2 fFromStr(const std::string& a) {
//    if (a == "A") return Foo2::A;
//    if (a == "B") return Foo2::B;
//    else          return Foo2::C;
//}

inline std::string fToStr(const Foo2 a) {
    switch (a) {
    case Foo2::A: return "A";
    case Foo2::B: return "B";
    default     : return "C";
    }
}
Run Code Online (Sandbox Code Playgroud)

主要.cpp

#include "Foo1.hpp"
#include "Foo2.hpp"

int main() {
    fToStr(Foo1::A);
    //fFromStr("A");
    fToStr(Foo2::A);
    //fFromStr("A");
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

根据我在网上阅读的内容,两个全局内联函数必须具有唯一的名称以避免未定义的行为。我相信未定义的行为将来自链接器任意选择其中一个函数并删除另一个函数

在上面的代码中,两者fFromStr会导致编译器错误,因为它们不明确:

In file included from main.cpp:2:
Foo2.hpp:9:13: error: ambiguating new declaration of 'Foo2 fFromStr(const string&)'
    9 | inline Foo2 fFromStr(const std::string& a) {
      |             ^~~~~~~~
In file included from main.cpp:1:
Foo1.hpp:9:13: note: old declaration 'Foo1 fFromStr(const string&)'
    9 | inline Foo1 fFromStr(const std::string& a) {
      |
Run Code Online (Sandbox Code Playgroud)

但是fToStr不会导致编译器错误,因为它的使用需要指定Foo1Foo2

我的问题是这两者是否fToStr会导致未定义的行为,或者它们的类型要求是否避免了问题

n. *_* m. 5

两个 fToStr 是否会导致未定义的行为,或者它们的类型要求是否避免了问题

inline std::string fToStr(const Foo1 a)
inline std::string fToStr(const Foo2 a)
Run Code Online (Sandbox Code Playgroud)

这些只是沼泽标准的普通重载函数。他们没有任何问题。