- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
看到this Meeting C++ 2015 lightning talk之后, 我用这段代码做了实验
#include <iostream>
#include <utility>
template <typename Fun, typename... Param>
auto generic_bind(Fun fun, Param&&... param)
{
return [fun, ¶m...] (auto&&... x)
{
return fun(std::forward<Param>(param)... ,
std::forward<decltype(x)>(x)...);
};
}
int demo(int a, int b, int c) { return a * b + c; }
int main()
{
// does work with int variables
int a = 11, b = 22, c = 33;
auto f1 = generic_bind(demo, a);
auto f2 = generic_bind(f1, b);
std::cout << f1(b, c) << f2(33); // both result in 275
}
将 main()
主体更改为
// does not work with int literals in g++ 5.2.0
auto f1 = generic_bind(demo, 11);
auto f2 = generic_bind(f1, 22);
std::cout << f1(22, 33) << f2(33);
使用 clang++ -Wall
都工作正常,但 GNU g++ 5.2 创建了一个 -Wuninitialized 警告:
main.cpp: In function 'int main()':
main.cpp:14:42: warning: '<anonymous>' is used uninitialized in this function [-Wuninitialized]
int demo(int a, int b, int c) { return a * b + c; }
^
main.cpp:27:31: note: '<anonymous>' was declared here
auto f2 = generic_bind(f1, 22);
^
main.cpp:14:42: warning: '<anonymous>' is used uninitialized in this function [-Wuninitialized]
int demo(int a, int b, int c) { return a * b + c; }
^
main.cpp:26:36: note: '<anonymous>' was declared here
auto f1 = generic_bind(demo, 11);
并给出意外结果 33(参见:Coliru live example)。哪个编译器在 C++14 上是正确的?
最佳答案
程序有未定义的行为,所以任何事情都有可能发生,所以可以说两个编译器都是正确的! GCC 的警告是存在问题的有用线索,即使它们没有解释确切的问题。
当您使用整数文字时,它会导致创建临时 int
对象,并且 Params&&
引用参数绑定(bind)到这些临时右值。然后,您的 lambda 使用引用捕获,因此您返回的闭包包含对临时对象的引用。
那些临时变量在完整表达式的末尾超出范围,即在调用 generic_bind
之后的分号处。这意味着当您调用 f1
和 f2
时,您会从悬空引用中读取数据,这是未定义的行为。
在原始代码中,Params&&
参数绑定(bind)到自动变量a
、b
和c
,然后闭包包含对这些相同对象的引用,并且当您调用 f1
和 f2
时它们仍在范围内。所以原始代码是可以的(尽管如果 f1
和 f2
转义到更广泛的范围并且比 a
, b
, 和 c
你会遇到同样的问题)。
关于c++ - g++ 5.2 - 使用整数文字调用模板参数包时未初始化警告,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34241503/
在我们的数据库表上,我们使用两个唯一的非聚集索引来创建跨四个字段的唯一约束。我们使用两个,因为其中一个字段 ZipCode 是一个可为空的字段。如果表中存在一条包含 ZipCode 的 null 条目
我刚刚开始学习 Rails 3 教程,以便对框架有一点熟悉,但我在生成 schema.rb 时遇到了问题。我的操作系统是 Windows 7 x64、Ruby 1.9.2、MySQL2 gem 0.2
我是一名优秀的程序员,十分优秀!