5

私はコードを持っています:

#include "stdafx.h"
#include <iostream>

using namespace std;


void func(const int& a)
{
    std::cout << "func(const)" << std::endl;
}

void func(volatile int& a)
{
    std::cout << "func(volatile)" << std::endl;
}

void func(const volatile int& a)
{
    std::cout << "func(const volatile)" << std::endl;
}

int main()
{
    const int a = 0;
    const volatile int b = 0;
    volatile int c = 0;
    func(a);
    func(b);
    func(c);
    system("pause");
    return 0;
}

上記のコードは、パラメーターが const/volatile であるかどうかに基づくオーバーロードを示しています。ただし、パラメーターを から に変更するint&int、コードがコンパイルされなくなり、const/volatile パラメーターの型に基づいてオーバーロードできなくなります。int が参照渡しの場合に const と volatile に基づいてオーバーロードできる理由がわかりませんが、値渡しの場合はそうではありませんか?

EDIT私は参照が何をするかを理解していることを強調する必要があります-参照エイリアスがconstでオーバーロードできる理由がわかりませんが、通常のintはそうではありません。

4

2 に答える 2

13

問題は、最上位のconstand/orvolatileがオーバーロードの解決で無視されることです。そう

void foo(const int);

とまったく同じです

void foo(int);

についても同様ですvolatile。これは言語規則であり、引数は値で渡されるため、理にかなっています。一方、参照const/volatileまたはポインターにconst/volatileは別の意味があります。非 const/volatile メソッドを参照または指し示すものに対して呼び出すことは許可されていません。ここでは、const volatileトップレベルではありません。

void foo(int& i);       // can modify what i refers to, and this has effects outside of foo.
void foo(const int& i); // cannot modify what i refers to

上記の 2 つの宣言はセマンティクスが大きく異なるため、言語はオーバーロードの解決に関してそれらを区別します。

于 2013-06-10T21:21:26.453 に答える