在函数调用中临时:UB?

时间:2016-09-06 08:16:38

标签: c++ language-lawyer undefined-behavior

根据this answer考虑​​以下代码:

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

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

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

1 个答案:

答案 0 :(得分:7)

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

函数调用中的临时StringBuilderfoo返回之前不会被销毁,所以没关系。

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