将一个右值引用,以"传值"的形式传递给函数作为参数,会有拷贝发生吗

将一个右值引用,以"传值"的方式传递给函数作为参数,会有拷贝发生吗?
下面这个小程序:

struct S{
    S(){cout<<"ctor"<<endl;}
    ~S(){cout<<"dtor"<<endl;}
    S(const S&){cout<<"copy"<<endl;}
    S(S&&){cout<<"move"<<endl;}
};
void f(S s){}//pass by value
int  main(){
    S s;
    f(move(s));
    return 0;
}

这个程序在GCC4.7下面编译运行输出是:
ctor
move
dtor
dtor

可是我觉得:
1. 程序似乎有语法错误啊,f函数接受一个值类型的参数,而main函数传递给它一个右值引用,这个能匹配吗?
2. 如果可以接受的话,值传递意味着拷贝,也就是从一个右值临时变量,拷贝出一份给f函数,那么难道不会调用copy ctor吗?

求各位高手解释一下哈
------解决思路----------------------
1. 是否能匹配,只要实参(argument)的类型可以隐式转换为形参(paramenter)的类型,就可以匹配。

S 有一个 move constructor ,所以从 S&& 转换到 S 是没有问题的。

2. C++ 的参数传递,是一个使用实参初始化形参的过程。参数传递的过程,与:
T parameter = argument;
的过程是一样。

所以,以上参数传递过程,可以参考:
S s_argument;
S s_parameter = std::move(s_argument);
在这里,显然要使用 move 而不是 copy constructor 。
------解决思路----------------------
第一个问题:

如果还有一个函数
void f(S&& s)
则会优先匹配这个,否则也会匹配void f(S s)
------解决思路----------------------
刚回答的可能不准确,加上可能会提示对重载函数调用不明确

这两个问题具体可以参看:http://blog.****.net/zwvista/article/details/6848582
------解决思路----------------------
左值引用和右值引用 都不过是引用而已
引用 是别名 这个含义没有改变
move 本身就是强制使用move 语义
所以没问题
------解决思路----------------------
源类型是 S&&,目标类型是 S,完美匹配 S(S&&),正说明应该调用移动构造函数啊。