Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/amazon-s3/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 在临时之前调用的析构函数应超出范围_C++_Auto_C++14_Decltype_Visual Studio 2015 - Fatal编程技术网

C++ 在临时之前调用的析构函数应超出范围

C++ 在临时之前调用的析构函数应超出范围,c++,auto,c++14,decltype,visual-studio-2015,C++,Auto,C++14,Decltype,Visual Studio 2015,我有一些代码在VS2015下失败,但在GCC下工作。我很确定这个bug是VisualStudio的,但是我想确定我对decltype(auto)的理解是正确的 #include <iostream> using namespace std; string zero_params() { return "zero_params called."; } template< typename F > auto test1( F f ) -> decltype(au

我有一些代码在VS2015下失败,但在GCC下工作。我很确定这个bug是VisualStudio的,但是我想确定我对decltype(auto)的理解是正确的

#include <iostream>
using namespace std;

string zero_params()
{
  return "zero_params called.";
}

template< typename F >
auto test1( F f ) -> decltype(auto)
{
  return f();
}

int main() {
  cout << std::is_rvalue_reference< decltype(test1(zero_params)) >::value << endl;
  cout << test1(zero_params) << endl;

  cout << "Done!" << endl;
  return 0;
}
#包括
使用名称空间std;
字符串零参数()
{
返回“调用零个参数。”;
}
模板
自动测试1(F)->decltype(自动)
{
返回f();
}
int main(){
cout::value因此我们可以得出以下结论:

  • 这是VS2015预览版中的一个错误
  • 有一些变通办法
问题在于:

  • 编译器应该将返回类型推断为字符串
  • 它实际上推断它是字符串&&
  • 因此,它过早地破坏了价值
解决办法是:

  • 不要对函数的返回类型使用decltype(auto)
  • 在传入函数之前,将其包装在lambda表达式中

正确,
f()
是一个PR值,因此
decltype
应该推断
std::string
而不是
std::string&
。请提交错误报告并在此处发布链接。如果
decltype(自动),在VS2015转到RTM之前确实需要修复此问题
并非无用……不幸的是,MS Connect告诉我,我无权提交错误报告。但在Visual Studio中,我已经做了下一件最好的事情——使用他们的“皱眉脸”提交反馈,包括测试代码的屏幕截图和说明。不幸的是,我认为这不符合要求hod是可跟踪的?希望有人把它传递给正确的部门WSA这在VS2015预览版或VS2015 CTP5中?如果你能给我一个屏幕截图,我可以为你提交错误报告。然后我会在答案中包含一个可跟踪的链接。请不要把答案放在评论中,伙计们。这篇文章是随后打破模型的完美例子。我们在评论中有事实(可以随时消失),半个答案没有提供任何证据,而是交叉引用评论(可以随时消失)。如果您想在回答问题之前与同事讨论问题,请尝试聊天室!!我们可以将这些评论整合到此答案中吗?评论是暂时的。
cout << test1(zero_params) << endl;
cout << test1( [](auto&&... ps) { return zero_params(std::forward<decltype(ps)>(ps)...); } ) << endl;