小编CTM*_*ser的帖子

复制构造函数和转发构造函数之间的冲突

此问题基于在GCC-4.6上适用于我的代码,但在C++ 0x模式下不适用于具有CLang-3.0的其他用户.

template <typename T>
struct MyBase
{
//protected:
    T  m;

    template <typename Args...>
    MyBase( Args&& ...x ) : m( std::forward<Args>(x)... ) {}
};
Run Code Online (Sandbox Code Playgroud)

一个对象MyBase可以采用任何构造函数参数列表,只要T支持那个构造签名.问题与特殊成员函数有关.

  1. IIUC,构造函数模板取消自动定义的默认构造函数.但是,由于模板可以接受零参数,因此它将充当显式定义的默认构造函数(只要是T可默认构造的).
  2. IIUC,确定类的复制构造策略忽略了构造函数模板.这意味着在这种情况下,MyBase将获得一个自动定义的复制构造函数(只要是T可复制的),即通道T复制构造.
  3. 也可以将上一步应用于移动构造.

因此,如果我传递一个MyBase<T> const &作为唯一的构造函数参数,哪个构造函数被调用,转发一个或隐式复制一个?

typedef std::vector<Int>  int_vector;
typedef MyBase<int_vector>   VB_type;

int_vector  a{ 1, 3, 5 };
VB_type     b{ a };
VB_type     c{ b };  // which constructor gets called
Run Code Online (Sandbox Code Playgroud)

我的用户的问题是将其用作基类.编译器抱怨他的类无法合成自动定义的复制构造函数,因为它找不到与基类的构造函数模板的匹配.它不应该MyBase为自己的自动拷贝构造函数调用自动拷贝构造函数吗?CLang错误地提出了冲突吗?

c++ constructor clang c++11

11
推荐指数
1
解决办法
1390
查看次数

C++ 11中是否有新的函数类型表达式格式?

今天我查看了Stroustrup的C++ 11 FAQ(2013年4月7日修改),并在type-alias部分的末尾看到了这个:

typedef void (*PFD)(double);    // C style
using PF = void (*)(double);    // using plus C-style type
using P = [](double)->void;     // using plus suffix return type
Run Code Online (Sandbox Code Playgroud)

其中lambda导入器用于启动使用后缀样式返回类型的通用函数类型表达式.这是官方的,还是掉线的测试/愿望清单功能?如果它是官方的,它对非静态成员函数有什么作用?

c++ function-prototypes c++11

11
推荐指数
1
解决办法
441
查看次数

如何一起使用C++和C可变参数?

通常,在函数中使用C++ 11可变参数模板功能要求基于可变参数的函数参数是函数参数列表中的最后一个.有一个例外; 如果存在C级可变参数,它们是倒数第二个参数,它们必须是最后的.

template < typename ...Args >
int  super_printf( Something x, Args &&...a, ... );
Run Code Online (Sandbox Code Playgroud)

我有时会随机思考C++,我想知道如何实现这样的功能.我首先想到了通常从a递归剥离的论点,然后我记得C级varargs没有级联.我必须马上把它们变成一个明确的va_list.

template < typename ...Args >
int  super_vaprintf( Something x, std::va_list &aa, Args &&...a );
// Note that "aa" is passed by reference.

template < typename ...Args >
int  super_printf( Something x, Args &&...a, ... )
{
    std::va_list  args2;
    int           result;

    va_start( args2, XXX );  // (A)
    try {
        result = super_vaprintf( x, args2, std::forward<Args>(a)... );
    } catch ( ... ) { …
Run Code Online (Sandbox Code Playgroud)

c++ templates variadic-functions variadic-templates c++11

11
推荐指数
2
解决办法
2071
查看次数

我如何有条件地定义默认构造函数?

我在考虑一个类:

template < typename ...Whatever >
class MyClass
{
public:
    static constexpr bool has_default_ctr = Something;

    // I want this only if "has_default_ctr" is "true".
    MyClass();

    //...
};
Run Code Online (Sandbox Code Playgroud)

我认为我不能使用构造函数模板std::enable_if(因为没有参数).我错了吗?如果没有,还有其他方法可以做到这一点吗?

c++ default-constructor enable-if c++11

7
推荐指数
2
解决办法
2945
查看次数

如何将enable_if用于互斥的非成员函数模板?

我正在尝试编写非成员运算符函数模板,如:

#include <utility>

template < typename T, unsigned L >
class MyType;

template < typename T, typename U, unsigned L >
auto  operator ==( MyType<T,L> const &l, MyType<U,L> const &r )
 -> decltype( std::declval<T>() == std::declval<U>() )
{ /*...*/ }
Run Code Online (Sandbox Code Playgroud)

但是当我尝试处理时间lr长度不同时:

template < typename T, unsigned Lt, typename U, unsigned Lu, class Enable = typename std::enable_if<(Lt < Lu)>::type >
auto  operator ==( MyType<T,Lt> const &l, MyType<U,Lu> const &r )
 -> decltype( std::declval<T>() == std::declval<U>() )
{ …
Run Code Online (Sandbox Code Playgroud)

c++ templates sfinae c++11

6
推荐指数
1
解决办法
1216
查看次数

如何制作基于可变参数的链式索引函数?

如果我有一个对象a,无论是内置数组还是具有合适类的类型operator [],并且其返回类型都可以自己编入索引,我应该如何编写一个泛型函数,该函数可以使用可变参数调用而不是分离来索引所有这些函数支架块?换句话说,我可以制作如下表达式:

a[i0][i1]...[iK]
Run Code Online (Sandbox Code Playgroud)

我希望能够将其作为单个函数编写:

slice( a, i0, i1, ..., iK )
Run Code Online (Sandbox Code Playgroud)

因为C++的规则需要operator []处理单个参数,使其与可变参数的东西不太兼容.(这个问题基于一个Usenet线程,在那里我尝试了类似的东西;最后我自己只解决了可能嵌套的内置数组.)

第一次刺:

template < typename T, typename U >
constexpr
auto slice( T &&t, U &&u ) noexcept(???) -> ???
{ return ce_forward<T>(t)[ ce_forward<U>(u) ]; }

template < typename T, typename U, typename V, typename ...W >
constexpr
auto slice( T &&t, U &&u, V &&v, W... &&w ) noexcept(???) -> ???
{
    return slice( ce_forward<T>(t)[ce_forward<U>(u)], ce_forward<V>(v),
     ce_forward<W>(w)... );
}
Run Code Online (Sandbox Code Playgroud)

ce_forward …

c++ arrays c++11

5
推荐指数
1
解决办法
348
查看次数

可变参数扩展可以用作逗号运算符调用链吗?

我在看“如何正确使用可变参数模板的引用”,并想知道逗号扩展可以走多远。

这是答案的一个变体:

inline void inc() { }

template<typename T,typename ...Args>
inline void inc(T& t, Args& ...args) { ++t; inc(args...); }
Run Code Online (Sandbox Code Playgroud)

由于可变参数被扩展到一逗号-分隔它们的元素的列表,是那些逗号语义上等同于模板/功能参数的分离器,或者他们插入词法,使得它们适用于任何(-预处理后)的使用,包括逗号操作符?

这适用于我的 GCC-4.6:

// Use the same zero-argument "inc"

template<typename T,typename ...Args>
inline void inc(T& t, Args& ...args) { ++t, inc(args...); }
Run Code Online (Sandbox Code Playgroud)

但是当我尝试时:

// Use the same zero-argument "inc"

template<typename T,typename ...Args>
inline void inc(T& t, Args& ...args) { ++t, ++args...; }
Run Code Online (Sandbox Code Playgroud)

我不断收到解析错误,期待“;” 在“...”之前,并且“args”不会扩展其包。为什么不起作用?是因为如果“args”为空,我们会得到一个无效的标点符号?合法吗,我的编译器不够好?

(我试过在括号中围绕“args”,和/或使用后增量;都没有奏效。)

c++ variadic comma c++11

5
推荐指数
1
解决办法
1223
查看次数

在可变扩展中的排序

对于这个非变量的例子:

int     Func1();
double  Func2();
void    MyFunc( int, double );

int  main()
{
    MyFunc( Func1(), Func2() );
    //...
}
Run Code Online (Sandbox Code Playgroud)

它没有规定是否Func1()还是Func2()先计算,只是两者都必须做之前MyFunc()被调用.

这个测序如何与可变参数的扩展一起工作?

template < typename Func, typename ...Args >
void  MyFunc2( Func &&f, Args&& ...a )
{
    int  b[] = { f( std::forward<Args>(a) )... };
    //...
}
Run Code Online (Sandbox Code Playgroud)

假设这f是一个在第一次调用后改变其状态的函数对象.是否会f为每个段调用a?换句话说,将fa列表中的第一个项目,然后第二个项目,第三个项目等上调用,而不是随机跳过扩展列表?我们曾经在每个项目之间调用序列点吗?

c++ variadic-functions sequence-points variadic-templates c++11

5
推荐指数
1
解决办法
522
查看次数

由于 master/main 更改,如何更新我的 GitHub 镜像?

我几年前镜像了一个 GitHub 项目。该项目参与了“master”到“main”分支的重大更名。我有一段时间没碰我的叉子了,我的叉子里有一根树枝,还有我的叉子的本地副本。但是当源项目使用“master”时,我的分支和特殊分支是基于的!如何将我的 fork 转换为使用“main”,包括同步到源的“main”?

git branch rename github

5
推荐指数
1
解决办法
2097
查看次数

如何发送事件供 Scene.handlesExternalEvents(matching:) 接收?

在 2020 年 Apple 平台 API 测试版中,添加了主题中提到的方法。(类似的方法已添加到AnyView。)有谁知道首先发送外部事件的相应API在哪里?

swiftui

5
推荐指数
1
解决办法
1589
查看次数