这是否在最近更新的标准下有效?
auto main = [](int argc, char* argv[]) -> int
{
return 0;
};
Run Code Online (Sandbox Code Playgroud)
我最好的猜测是它取决于main()必须是一个函数,还是允许它是可调用的任何全局范围符号(with ()).
编辑:根据一些评论,简单来说,我的意思是a)更少的代码,b)易于维护,和c)很难出错.
编辑#2:另外,如果它确实简化了实现,那么使用包含而不是私有继承并不令人反感InterfaceImpl.
目前,我知道这样做的唯一方法是让实现者定义抽象方法并将调用委托给目标基类型的方法.例:
#include <iostream>
#include <memory>
class Interface
{
public:
virtual void method1() = 0;
virtual void method2(int x) = 0;
};
class MethodOneImpl
{
private:
void method1(int x)
{ std::cout << "MethodOneImpl::method1() " << x << std::endl; }
public:
void method1() { method1(0); }
};
class MethodTwoImpl
{
public:
void myFunc(int x)
{ std::cout << "MethodTwoImpl::myFunc(x)" << x << std::endl; }
};
class InterfaceImpl : public Interface
, private MethodOneImpl
, private MethodTwoImpl
{ …Run Code Online (Sandbox Code Playgroud) 一时兴起,我尝试使用clang 2.9将main函数定义为模板函数:
template <typename T = void>
int main(int argc, char **argv)
{
}
Run Code Online (Sandbox Code Playgroud)
并收到以下错误.
error: 'main' cannot be a template
int main(int argc, char **argv)
^
Run Code Online (Sandbox Code Playgroud)
有谁知道标准的哪一部分禁止这个,以及相关的文字是什么?
这是有效的C++(考虑到最新标准)吗?我在Ubuntu 12.04上使用near-of-tree-clang/libc ++获得编译错误.如果它应该有效,我将邮件发送给clang-dev列表,其中包含错误消息等.
#include <functional>
#include <unordered_set>
struct X
{
int i;
};
void f ()
{
std::unordered_set<std::reference_wrapper<X>> setOfReferencesToX;
// Do stuff with setOfReferencesToX
}
Run Code Online (Sandbox Code Playgroud)
**顺便说一句,我已经厌倦了这个问题/答案是针对最新标准的.作为一个整体的C++社区,请开始限定旧标准特有的东西吗?新标准已经推出了大约一年了.