C++如何调用header-only库

C++ how to call header-only library

我通过添加 inline 关键字学习了 C++17 处理 header-only 库的方法:

#include <iostream>
#include <string>
using namespace std;

struct C {
    static const inline string N {"abc"};
};

int main() {
    cout << C::N << endl;
    return 0;
}

运行 以上代码 returns abc 符合预期。

但是,如果我尝试使用 pre-C++17 样式如下:

#include <iostream>
#include <string>
using namespace std;

struct C {
    static std::string& N() {
        static std::string s {"abc"};
        return s;
    }
};

int main() {
    cout << C::N << endl;
    return 0;
}

我得到的结果是 1 而不是预期的 abc。我想知道为什么以及如何解决它?

似乎可以通过在第二种情况的 N 后添加 () 轻松解决:

#include <iostream>
#include <string>
using namespace std;

struct C {
    static std::string& N() {
        static std::string s {"abc"};
        return s;
    }
};

int main() {
    cout << C::N() << endl;
    return 0;
}

这里的问题来自于你的两个 'N' 声明之间的差异。 在第一种情况下 static const inline string N {"abc"}; 是一个字符串变量。 在第二种情况下 static std::string& N() 是一个函数。 这就是为什么当您第一次使用 C::N 时,它与使用 "abc" 相同,因为它只是一个字符串变量。这也是为什么它在第二种情况下不能按预期工作的原因:C::N 是一个函数,而不是典型意义上的变量。因此,对于 运行 函数,您必须使用 C::N() 调用它,其中 确实 输出一个字符串。

编辑:请参阅@1201ProgramAlarm 对您的问题的评论,了解在未调用函数时得到 1 的原因。