Boost logo

Boost :

From: David Abrahams (dave_at_[hidden])
Date: 2005-06-03 06:38:13


Vladimir Prus <ghost_at_[hidden]> writes:

> Hello,
> the program_options library fails one tests on EDG compilers (Intel, Como),
> which a failure to deduce template arguments for a certain call. After reading
> the standard for some time, I failed to understand the reason.
>
> Below is the test program:
>
>
> char* cmdline3_[1] = {};
>
> template<class charT>
> void func(const charT* const argv[]) {}
>
> int main()
> {
> // P is 'const charT* const argv[]'cmdline3_
> // A is 'char* cmdline3_[]'

I think A is 'char*[1]'

> // According to 14.8.2.1/2
> // If P is not reference type
> // -If A is an array type, the pointer type produced
> // by the array-to-pointer standard convertion (4.2)
> // is used in place of A for type deduction.
> //
> // So, A should become 'char**'
>
> // The following does not compile.
> func(cmdline3_);
>
> char** p = cmdline3_;
> // This does compile, even though the argument type used for
> // type deduction should be the same as in example above.
> func(p);
>
> }
>
> Anybody can explain what's going on?

It's well known that converting a char** into a char const** is a
type-safety hole, so the language doesn't allow it (see D&E for the
details, I think). 'char*[1]' converts (by array-to-pointer) to 'char**',
but a 'const charT* const[]' parameter is equivalent to char const*
const*', so a similar logic applies.

    

-- 
Dave Abrahams
Boost Consulting
www.boost-consulting.com

Boost list run by bdawes at acm.org, gregod at cs.rpi.edu, cpdaniel at pacbell.net, john at johnmaddock.co.uk