代码是 c++Primer 上的一个例子修改来的
用 g++ 的话第 20 行通不过编译;用 visual studio 20 和 21 行都通不过编译
是因为这里面有什么未定义行为吗?
(DebugDelete(cout));
和 DebugDelete(cout);
区别在哪里?
有个发现就是在这里 DebugDelete(cout)行为是类似于 int (a)的,编译器会认为这里定义了一个变量 cout 。
还有就是
DebugDelete(cout).operator()(p); //可以运行
DebugDelete(cout)(p) ; //报错
#include <iostream>
using namespace std;
class DebugDelete {
public:
DebugDelete(std::ostream& o) :os(o) {
}
template<typename T> void operator()(T* p) {
delete(p);
os << "deleted\n";
}
private:
std::ostream& os;
};
int main() {
int* p = new int(10);
(DebugDelete(cout));
DebugDelete{ cout };
DebugDelete(cout); //
DebugDelete(std::cout);
}
编辑的过程中想到这个例子应该可以抽象成这样,所以这个其实可能是变量声明优先于临时对象构造函数的问题?关于这个有没有详细解释?
class A {
public:
A(int n){}
};
int n = 10;
int main() {
(A(n)); // ok
A(n); // error
}
这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。
V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。
V2EX is a community of developers, designers and creative people.