标签: default-arguments

默认模板参数如何工作?

我知道很多关于模板默认参数语法的问题.

通常,答案(与我对它应该如何工作的理解同步)是使用类似的东西:

template <class T = SomeDefault> class T1 {};
Run Code Online (Sandbox Code Playgroud)

最近我想检查Boost在其中使用哪个地图实现mapped_vector.并找到以下代码段:

template<class T, class A>
class mapped_vector:
Run Code Online (Sandbox Code Playgroud)

显然,参数没有默认绑定A,但显然,我可以实例化mapped_vector<int>一下就好了.Obviosuly以某种方式推断出默认参数,但是如何?

编辑:准确地说,我在谈论这个文件中的第279行

c++ templates default-arguments

4
推荐指数
1
解决办法
135
查看次数

不实例化具有默认模板参数的模板结构

假设我有这个代码

template<typename T2, typename T = int>
struct X
{
    static double f;
};

template<typename T>
double X<T>::f = 14.0;
Run Code Online (Sandbox Code Playgroud)

如果我尝试编译clang给我以下错误

声明的嵌套名称说明符'X ::'不引用类,类模板或类模板部分特化

对于海湾合作委员会:

错误:非模板'double X :: f'的模板定义

问题是 :

为什么编译器希望我们像这样专门化struct X:

template<typename T2>
struct X<T2,int>
{
    static double f;
};
Run Code Online (Sandbox Code Playgroud)

第一个声明int作为默认参数,为什么编译器不选择此声明?

我在标准锚[temp.spec]中搜索但它没有帮助.

我问这个问题后,回答了这个一个对SO.

谢谢你的帮助 !

c++ templates template-specialization default-arguments

4
推荐指数
1
解决办法
763
查看次数

使用花括号初始化程序的默认参数

我有这段代码似乎运作良好:

class foo{/* some member variables and functions*/};
void do_somthing(foo x={}){}
int main(){
  do_somthing();
}
Run Code Online (Sandbox Code Playgroud)

我以前用来void do_somthing(foo x=foo()){}默认x参数,但我={}在一些书或在线的例子中看到了这种方式(不记得了).使用它完全没问题吗?这两种方法有什么区别吗?

c++ initialization default-arguments c++11

4
推荐指数
1
解决办法
1770
查看次数

重新定义默认参数

在编译某些代码时,我遇到了一个错误,说"重新定义默认参数".这是抛出错误的行:

bool wCommandDistributor::initialise (const bool server = true, const short ncmds=0,
                byte (*cmds)[CMD_MAX_RECLEN] = (byte (*)[CMD_MAX_RECLEN])0)
Run Code Online (Sandbox Code Playgroud)

无论如何我是否可以重写代码以解决错误?这不是我写的代码.我正在帮助重写代码,它是用C++编写的.

提前致谢.

c++ default-arguments

4
推荐指数
1
解决办法
5245
查看次数

Python:函数中的默认列表

来自 Summerfield 的 Python3 编程:

它的意思如下:当给出默认值时,它们是在执行 def 语句时创建的,而不是在调用函数时创建的。但我的问题是针对以下示例:

def append_if_even(x, lst =None):
    lst = [] if lst is None else lst
    if x % 2 ==0:
        lst.append(x)
    return lst
Run Code Online (Sandbox Code Playgroud)

第一次执行时,lst 指向 None 但在函数调用append_if_even(2)之后,

  • lst 不应该指向 [2],因为在 lst.append(x) lst 之后 lst 不再指向 None 吗?

  • 为什么下一次执行仍然使lst指向none?

  • 这个函数调用append_if_even(2)内部到底发生了什么?

python-3.x default-arguments

4
推荐指数
1
解决办法
3万
查看次数

默认参数和空列表初始化

考虑以下代码,一个简单的类,其构造函数采用带有默认值的参数.

// Version 1
template <class T>
struct object1 {
    using type = T;
    constexpr object1(const type& val = type()): value(val) {}
    type value;
};

// Version 2
template <class T>
struct object2 {
    using type = T;
    constexpr object2(const type& val = {}): value(val) {}
    type value;
};

// Main
int main(int argc, char* argv[]) {
    using type = /* Something */;
    object1<type> x1;
    object2<type> x2;
    auto value1 = x1.value;
    auto value2 = x2.value;
    // Is there certain types …
Run Code Online (Sandbox Code Playgroud)

c++ default-constructor default-arguments c++11 list-initialization

4
推荐指数
1
解决办法
95
查看次数

有没有办法确保传递给函数的两个参数被视为 C++ 中的第一个和第三个参数?

假设有一个具有以下原型的函数:

void fun (int = 10, int = 20, int = 30, int = 40);
Run Code Online (Sandbox Code Playgroud)

如果通过向其传递 2 个参数来调用此函数,我们如何确保将这些参数视为第一个和第三个参数,而将第二个和第四个参数视为默认值。

c++ overloading default-arguments

4
推荐指数
1
解决办法
107
查看次数

为什么不允许 constexpr 局部变量作为默认函数参数?

我想我明白为什么 C++ 不允许局部变量作为默认函数参数:

int main () {
   auto local{1024};
   auto lambda = [](auto arg1 = local){};    // "illegal use of local variable as default parameter"
}
Run Code Online (Sandbox Code Playgroud)

但即使该变量是constexpr local也是不允许的:

int main () {
   constexpr auto local{1024};
   auto lambda = [](auto arg1 = local){};    // "illegal use of local variable as default parameter"
}
Run Code Online (Sandbox Code Playgroud)

但是,允许使用全局变量(即使是非 constexpr):

int global;
int main () {
   auto lambda = [](int arg1 = global){};    // OK
}
Run Code Online (Sandbox Code Playgroud)

有人可以解释在这种情况下不允许使用 constexpr 局部变量的理由吗?当默认值是固定的并且在编译时已知时,编译器似乎应该能够为函数构造适当的“默认参数”重载。

c++ default-arguments constexpr

4
推荐指数
1
解决办法
69
查看次数

std::function 和默认函数参数

这是使用的简单示例std::function

#include <iostream>
#include <functional>

//A function that sums two numbers.
//Arguments having default values.
void SumOfTwoNumbers(int a = 42, int b = 42)
{
    std::cout << "Sum of two numbers :: " << a + b << std::endl;
}

int main()
{
    std::function<void(int, int)> testFunc = SumOfTwoNumbers;

    SumOfTwoNumbers();          //Works
    testFunc();                 //Compile time error          
    testFunc(40, 40);           //Works

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

在main函数中,共有三个函数调用。第一个和最后一个有效。而没有任何参数的第二次调用testFunc()会给出编译时错误。

它不应该考虑默认参数并成功执行吗?

c++ default-arguments

4
推荐指数
1
解决办法
172
查看次数

从指针转换为非标量对象类型?

有人可以解释为什么以下工作,尝试以下代码,它工作正常.

class A { 
public :
    int32_t temp ;
    A ( bool y = false  ) { }
} ;

int main ( int argc, char *argv[] )
{

  A temp ; 
  temp = new A () ;
  temp.temp = 5 ;

  std::cout << " " << temp.temp << std::endl ;
  return EXIT_SUCCESS;
}               // ----------  end of function main  ----------
Run Code Online (Sandbox Code Playgroud)

c++ pointers overloading default-arguments

3
推荐指数
1
解决办法
21
查看次数