我知道很多关于模板默认参数语法的问题.
通常,答案(与我对它应该如何工作的理解同步)是使用类似的东西:
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行
假设我有这个代码
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.
谢谢你的帮助 !
我有这段代码似乎运作良好:
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参数,但我={}在一些书或在线的例子中看到了这种方式(不记得了).使用它完全没问题吗?这两种方法有什么区别吗?
在编译某些代码时,我遇到了一个错误,说"重新定义默认参数".这是抛出错误的行:
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++编写的.
提前致谢.
它的意思如下:当给出默认值时,它们是在执行 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?
考虑以下代码,一个简单的类,其构造函数采用带有默认值的参数.
// 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
假设有一个具有以下原型的函数:
void fun (int = 10, int = 20, int = 30, int = 40);
Run Code Online (Sandbox Code Playgroud)
如果通过向其传递 2 个参数来调用此函数,我们如何确保将这些参数视为第一个和第三个参数,而将第二个和第四个参数视为默认值。
我想我明白为什么 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 局部变量的理由吗?当默认值是固定的并且在编译时已知时,编译器似乎应该能够为函数构造适当的“默认参数”重载。
这是使用的简单示例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()会给出编译时错误。
它不应该考虑默认参数并成功执行吗?
有人可以解释为什么以下工作,尝试以下代码,它工作正常.
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)