0

inline我通过添加关键字学习了 C++17 处理仅标头库的方法:

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

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

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

运行上面的代码abc按预期返回。

但是,如果我尝试使用 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。我想知道为什么以及如何解决它?

4

2 回答 2

1

这里的问题来自您的两个“N”声明之间的差异。在第一种情况下static const inline string N {"abc"};是一个字符串变量。在第二种情况下static std::string& N()是一个函数。这就是为什么当你C::N第一次使用它时,它和"abc" 在它的位置使用是一样的,因为它只是一个字符串变量。这也是为什么它在第二种情况下不能按预期工作的原因:C::N是一个函数而不是典型意义上的变量。因此,要运行该函数,您必须使用C::N()which does output a string 调用它。

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

于 2020-04-14T20:44:25.023 回答
0

似乎可以通过()在第二种情况下在 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;
}
于 2020-04-14T20:37:05.703 回答