临时工的生命时间传递给职能部门

时间:2018-06-01 12:49:04

标签: c++

低于代码有效 - 非UB?

struct GeoPoint {
  std::string toString() const {
      return std::string("123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890");
  }
};

struct Data {
  const GeoPoint  getPt() const {
      return GeoPoint();
  }
};

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

int main()
{
    Data dr;
    foo(dr.getPt().toString().c_str());    
}

我的理解是在函数参数求值期间创建的临时值被销毁,直到完整表达式结束 - 因此函数执行,然后结束然后临时。被毁了。我对吗?我在类似的代码中遇到崩溃,但该函数实际上通过可变数量的参数宏获取可变数量的参数。所以代码看起来更像是这样:

void log_print(char const * szFormat, ...) { ... }
#define LOG(fmt, ...) do { \
    log_print(fmt, ##__VA_ARGS__);\
} while(0)

Data dr;
LOG("%s", dr.getPt().toString().c_str());   

1 个答案:

答案 0 :(得分:3)

代码定义明确。

c_str()返回的指针在foo调用的生命周期内有效:匿名临时值在语句结束前不会超出范围foo(dr.getPt().toString().c_str());。 / p>