在函数调用中临时:UB?

rai*_*ner 4 c++ undefined-behavior language-lawyer

根据以下答案考虑以下代码:

#include <iostream>
#include <sstream>

class StringBuilder {
public:
    template <typename T> inline StringBuilder &operator<<(T const &t) {
        ss << t;
        return *this;
    }

    inline char const * c_str() {
        return ss.str().c_str();
    }

private:
    std::stringstream ss;
};

void foo(const char *x) {
    std::cout << x << std::endl;
}

int main() {
    foo((StringBuilder() << "testing " << 12 << 3 << 4).c_str());
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

foo()使用临时StringBuilder的返回值调用是否会以任何方式导致UB?

我问的原因是上面的例子效果很好,但在现实生活中,我使用的是一个库,其中包含日志工具,使用这个库我会得到不正确的输出(日志功能需要我的char*正确但在内部覆盖它,这使我相信内存不再有效).

Seb*_*edl 7

是的,但不是因为你的想法.

StringBuilder函数调用中的临时函数在foo返回之后不会被销毁,所以没关系.

但是,该c_str()方法返回调用的结果.str().c_str(),并且由此返回的临时字符串str()作为StringBuilder::c_str()返回被销毁,这意味着返回的指针在外部是无效的.使用此指针会导致UB.