gpt4 book ai didi

visual-studio-2010 - 使用 C++0x decltype 返回值时返回局部变量或临时变量的地址

转载 作者:行者123 更新时间:2023-12-02 00:39:35 27 4
gpt4 key购买 nike

编辑:

这确实是编译器的一个bug,我开了一个defect并得到以下响应。

Hello Motti,
Thank you for submitting this issue. As noted in the stackoverflow posting, this is a bug in our decltype implementation. Unfortunately, we cannot fix this bug in the next release of Visual Studio since the code is relatively uncommon, and we are particularly resource constrained.

后面是原始问题


我正在研究 VS10 的 C++0x 特性,我遇到了以下问题。

std::map<int, int> map()
{
return std::map<int, int>();
}

template <class F>
auto call(F f) -> decltype(f())
{
auto ret = f();
return ret;
}

void check()
{
auto m = call(map);
}

我收到以下警告:

warning C4172: returning address of local variable or temporary

但是,当我更改 call 的原型(prototype)时成为旧风格:

std::map<int, int> call(F f)

没关系,call时也OK不是模板函数(即使使用推导的返回类型)。

如果我查看 ret 的类型这是std::map<int, int> (没有引用或指针)。

这是 VS10 中的错误还是我遗漏了什么。

最佳答案

call(map);将 map 隐式转换为函数指针,使函数:

auto call( std::map<int,int>(*f)() ) -> decltype(f())

看起来 VC10 不符合 decltype 的 c++0x FCD,它说:

The type denoted by decltype(e) is defined as follows:

  • if e is an unparenthesized id-expression or a class member access [snip, it isn't]

  • otherwise, if e is a function call (5.2.2) or [snip], decltype(e) is the return type of the statically chosen function;

  • otherwise, if e is an lvalue, decltype(e) is T&, where T is the type of e;

  • otherwise, decltype(e) is the type of e.

5.2.2明确了通过函数指针调用是“函数调用”所以decltype(f())应该是 std::map<int,int> .相反,它将 f() 视为左值压缩,结果为 std::map<int,int> & .已正确推断出 ret 的类型,但返回值将其转换为引用。

当您使用函数表达式而不是函数指针表达式时,此错误不会出现,decltype(map())正确结果为 std::map<int,int> .

关于visual-studio-2010 - 使用 C++0x decltype 返回值时返回局部变量或临时变量的地址,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3158999/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com