c++ 这些内联函数会导致未定义的行为吗

3gtaxfhh  于 2023-05-08  发布在  其他
关注(0)|答案(1)|浏览(205)

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";
    }
}

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";
    }
}

main.cpp

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

int main() {
    fToStr(Foo1::A);
    //fFromStr("A");
    fToStr(Foo2::A);
    //fFromStr("A");
    return 0;
}

根据我在网上读到的内容,两个全局内联函数必须有唯一的名称,以避免未定义的行为。我相信未定义的行为来自链接器任意选择其中一个函数并删除另一个函数
在上面的代码中,两个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) {
      |

但是,fToStr不会导致编译器错误,因为使用它需要指定Foo1Foo2
我的问题是,这两个fToStr是否会导致未定义的行为,或者它们的类型要求是否避免了问题

bq3bfh9z

bq3bfh9z1#

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

inline std::string fToStr(const Foo1 a)
inline std::string fToStr(const Foo2 a)

这些都是普通的重载函数。他们没有任何问题。

相关问题