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
的原因。
我通过添加 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
的原因。