具有默认值的参数的自动类型扣除

auto type deduction for argument with default value

本文关键字:类型 参数 默认值      更新时间:2023-10-16

我很抱歉没有足够的时间进行深入调查并依靠您的帮助。

考虑简单的代码:

#include <iostream>
enum class PrintColour
{
    COLOUR_1        =   0,
    COLOUR_2        =   1,
};
 
void colour( auto c = PrintColour::COLOUR_1 )
{
    switch ( c )
    {
        case PrintColour::COLOUR_1:
            std::cout << "Colour 1" << std::endl;
            break;
        case PrintColour::COLOUR_2:
            std::cout << "Colour 2" << std::endl;
    }
}
int main( )
{
//  colour( ); couldn't deduce template parameter ‘auto:1’
    colour( PrintColour::COLOUR_1 );    // Fine!
}

此代码完全按照编译和运行而没有问题。但是,如果我删除colour( );,则G 会发出错误:

auto_param.cpp: In function ‘int main()’:
auto_param.cpp:27:10: error: no matching function for call to ‘colour()’
  colour( );
          ^
auto_param.cpp:13:6: note: candidate: template<class auto:1> void colour(auto:1)
 void colour( auto c = PrintColour::COLOUR_1 )
      ^~~~~~
auto_param.cpp:13:6: note:   template argument deduction/substitution failed:
auto_param.cpp:27:10: note:   couldn't deduce template parameter ‘auto:1’
  colour( );
          ^

我可能只是错过了一个愚蠢的观点,或者我真的很愚蠢和误解了整个事情。

我是否应该能够将函数参数声明为 auto,同时仍然能够在C 11或C 14中给它一个默认值?

我认为给定的默认值足以让编译器推论参数类型...


编辑1:

它认为我需要更清楚我的问题,这样就不会被C 中的一个参数传递给Auto吗?

此处的重点不是将auto传递给一个函数,而是将auto与A 默认值结合使用,而该参数是上述问题中未考虑的内容。

编辑2:

在此处注释中阐明的那样,C 11没有将auto作为参数传递的功能,但是C 14和ON(G 6.3.1默认为gnu 14(似乎是。但是,我最初的问题与C 11无关,我的问题不是C 11是否支持auto参数。我依靠auto作为参数,但忘了对其进行仔细检查最低标准版本。我的歉意,我现在就解决了。

g++ -std=c++11 auto_param.cpp -o auto_param
auto_param.cpp:13:14: error: use of ‘auto’ in parameter declaration only available with -std=c++14 or -std=gnu++14

我希望清楚我的问题之间的区别,并且自动是常规函数中的参数a GCC 4.9扩展名。请告诉我,如果不是。

no,这是一个非养子上下文。

非截止性上下文

在以下情况下,类型,模板和 用于组成P的非型值不参与 模板参数扣除,而是使用模板参数 是在其他地方推论或明确指定的。如果一个 模板参数仅在非卵子上下文中使用,而不是 明确指定的模板参数扣除失败。

&lt; ...>

4(a 函数参数的参数类型中使用的模板参数 在呼叫中使用的默认参数 参数扣除正在完成

我是否应该能够将功能参数声明为自动,同时仍然能够在C 11或C 14中给它一个默认值?

我不知道C 17是否支持它,但是,我知道,C 11和C 14不支持函数的auto参数(C 14仅支持它lambda函数(

我认为给定的默认值足以让编译器推论参数类型...

如果您接受使用模板类型而不是auto,则还必须添加默认模板类型。

如下所示

template <typename T = decltype(PrintColour::COLOUR_1)>
void colour( T c = PrintColour::COLOUR_1 )
{
    switch ( c )
    {
        case PrintColour::COLOUR_1:
            std::cout << "Colour 1" << std::endl;
            break;
        case PrintColour::COLOUR_2:
            std::cout << "Colour 2" << std::endl;
    }
}

我知道:是多余的。

- 编辑 -

OP说

我只是想知道我是否通过不重复

来使我的代码更可读

更可读的可能不是...如果您想要它不重复...我知道宏是蒸馏邪恶的,但是...如果您真的想要避免重复...

#define noRepeat(r, n, a, b) 
r n (decltype(b) a = b)
noRepeat(void, colour, c, PrintColour::COLOUR_1)
{
    switch ( c )
    {
        case PrintColour::COLOUR_1:
            std::cout << "Colour 1" << std::endl;
            break;
        case PrintColour::COLOUR_2:
            std::cout << "Colour 2" << std::endl;
    }
}

或(如果您想根据参数制作技巧(

#define parDef(a, b)  decltype(b) a = b
void colour ( parDef(c, PrintColour::COLOUR_1), parDef(d, 5) )
{
    switch ( c )
    {
        case PrintColour::COLOUR_1:
            std::cout << "Colour 1" << std::endl;
            break;
        case PrintColour::COLOUR_2:
            std::cout << "Colour 2" << std::endl;
    }
}