我正在尝试学习可变参数模板和函数.我无法理解为什么这段代码不能编译:
template<typename T>
static void bar(T t) {}
template<typename... Args>
static void foo2(Args... args)
{
(bar(args)...);
}
int main()
{
foo2(1, 2, 3, "3");
return 0;
}
Run Code Online (Sandbox Code Playgroud)
当我编译它失败时出现错误:
错误C3520:'args':必须在此上下文中扩展参数包
(在功能上foo2).
我在这里看到了这个,我不知道这意味着什么:
&(int) { 1 }
Run Code Online (Sandbox Code Playgroud)
我觉得这很奇怪,因为它似乎是无效的语法.它正在构建一个块范围(?),中间有一个随机1(没有分号)并取地址.对我来说没有多大意义.你们能开导我吗?
尝试用C++ 11,所以它编译:
auto a = &(int) { 1 };
Run Code Online (Sandbox Code Playgroud)
但我不知道如何处理变量.
struct HybridExpression {
RawExpressionElement *ree;
ExpressionNode *en;
};
vector<HybridExpression> hexpression;
hexpression.insert(hexpression.begin() + starti,
(HybridExpression) {NULL, en});
Run Code Online (Sandbox Code Playgroud)
gcc在没有警告的情况下构建,但Visual Studio 2010甚至无法编译它.
它不喜欢这一点: (HybridExpression) {NULL, en}
在海湾合作委员会,我能够做到这一点:
(CachedPath){ino}
inode->data = (struct Data)DATA_INIT;
Run Code Online (Sandbox Code Playgroud)
哪里:
struct CachedPath
{
Ino ino;
};
typedef int8_t Depth;
struct Data
{
Offset size;
Blkno root;
Depth depth;
};
#define DATA_INIT {0, -1, 0}
Run Code Online (Sandbox Code Playgroud)
MSVC为这些类型的转换提供以下错误:
error C2143: syntax error : missing ';' before '{'
Run Code Online (Sandbox Code Playgroud)
我怎样才能在MSVC中这样做?进一步注意,代码已经从C99转换而来,我为此使用了指定的初始值设定项,然后进行类似的转换.关于C99与C++的MSVC/GCC实现之间如何关联这些各种特征的任何清晰都是值得赞赏的.
在我尝试结合移动语义学习 C++ 的 const 正确性时,我最终得到了以下代码。
再次:
#include <iostream>
class ThisReference
{
public:
void f() const && { std::cout << "f() const &&\n"; }
};
int main()
{
(const ThisReference){}.f();
}
Run Code Online (Sandbox Code Playgroud)
Godbolt [所有候选方法的时间稍长一些]
该代码使用 GCC 编译,我想我明白它的意思,即:
(const ThisReference)定义类型。我希望它是 const,所以我把它放在括号中。{}执行该类型的初始化;创建一个对象.f()调用方法;结束声明最终我将该代码放入 Visual Studio 中,但它没有编译。错误信息是
error C4576: a parenthesized type followed by an initializer list is a non-standard explicit type conversion syntax
Run Code Online (Sandbox Code Playgroud)
我对我的代码有两个问题。
例如,我可以将数组硬编码为参数:
void test(pair<string,int> v[],int size){
for(int i=0;i<size;i++){
printf("%s %d\n",v[i].first.c_str(),v[i].second);
}
}
int main(){
test((pair<string,int>[]){make_pair("a",1),make_pair("b",2)},2);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
所以我不需要创建pair v []的临时变量,然后不需要担心temp变量的变量名,如果使用vector,是否有类似的语法:
void test(vector<pair<string,int> > v){
for(pair<string,int> p : v){
printf("%s %d\n",p.first.c_str(),p.second);
}
}
Run Code Online (Sandbox Code Playgroud)
?
我正在尝试用float变量的内存地址填充byte/char数组(数组长度是4个字节=指针),但无论我做什么它都会保持浮点值而不是地址:
float f = 20.0f;
memcpy(data, &f, sizeof(data));
Run Code Online (Sandbox Code Playgroud)
调试它:
printf("Array: %#X, %#X, %#X, %#X", data[0], data[1], data[2], data[3]);
Run Code Online (Sandbox Code Playgroud)
...以十六进制格式给出浮点值(20.0):
Array: 0, 0, 0XA0, 0X41
Run Code Online (Sandbox Code Playgroud)
我需要的是float的内存地址.我尝试以某种不同的方式进行铸造/解除引用,但无法使其工作......